Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 42 additions & 45 deletions MainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

47 changes: 24 additions & 23 deletions MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ private void btnBrowseSource_Click(object sender, EventArgs e)
using (var fbd = new FolderBrowserDialog())
{
if (fbd.ShowDialog() == DialogResult.OK)
{
txtSourceFolder.Text = fbd.SelectedPath;
}
}
}

Expand All @@ -38,9 +36,7 @@ private void btnBrowseDest_Click(object sender, EventArgs e)
{
sfd.Filter = "Outlook Data File (*.pst)|*.pst";
if (sfd.ShowDialog() == DialogResult.OK)
{
txtDestPst.Text = sfd.FileName;
}
}
}

Expand All @@ -49,8 +45,7 @@ private void btnFixRegistry_Click(object sender, EventArgs e)
try
{
Log("Applying PST size limit fixes to registry...");

// We target Outlook 15.0 and 16.0

string[] versions = { "15.0", "16.0" };
foreach (var v in versions)
{
Expand All @@ -59,7 +54,6 @@ private void btnFixRegistry_Click(object sender, EventArgs e)
{
if (key != null)
{
// Values in MB. 2000000 MB = ~2 TB (effectively unlimited)
key.SetValue("MaxLargeFileSize", 2000000, RegistryValueKind.DWord);
key.SetValue("WarnLargeFileSize", 1900000, RegistryValueKind.DWord);
}
Expand All @@ -80,6 +74,7 @@ private async void btnStartMerge_Click(object sender, EventArgs e)
{
string sourceDir = txtSourceFolder.Text;
string destFile = txtDestPst.Text;
bool removeDups = chkRemoveDuplicates.Checked;

if (string.IsNullOrEmpty(sourceDir) || !Directory.Exists(sourceDir))
{
Expand All @@ -101,11 +96,14 @@ private async void btnStartMerge_Click(object sender, EventArgs e)
long totalSourceSize = 0;
var pstFilesCheck = Directory.GetFiles(sourceDir, "*.pst", SearchOption.TopDirectoryOnly);
foreach (var f in pstFilesCheck) totalSourceSize += new FileInfo(f).Length;
if (di.AvailableFreeSpace < (totalSourceSize * 1.1)) // 10% buffer

if (di.AvailableFreeSpace < (totalSourceSize * 1.1))
{
var msg = string.Format("Warning: You might not have enough disk space on {0}.\nAvailable: {1} GB\nRequired (est): {2} GB\n\nContinue anyway?",
drive, di.AvailableFreeSpace / 1024 / 1024 / 1024, (totalSourceSize * 1.1) / 1024 / 1024 / 1024);
var msg = string.Format(
"Warning: You might not have enough disk space on {0}.\nAvailable: {1} GB\nRequired (est): {2} GB\n\nContinue anyway?",
drive,
di.AvailableFreeSpace / 1024 / 1024 / 1024,
(totalSourceSize * 1.1) / 1024 / 1024 / 1024);
if (MessageBox.Show(msg, "Disk Space Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
return;
}
Expand All @@ -121,26 +119,28 @@ private async void btnStartMerge_Click(object sender, EventArgs e)

btnStartMerge.Enabled = false;
btnFixRegistry.Enabled = false;
chkRemoveDuplicates.Enabled = false;
btnCancel.Visible = true;
btnCancel.Enabled = true;
progressBar.Value = 0;
progressBar.Maximum = pstFiles.Length;

Log(string.Format("Starting merge of {0} files...", pstFiles.Length));
string dupMode = removeDups ? " (Remove Duplicates: ON)" : " (Remove Duplicates: OFF)";
Log(string.Format("Starting merge of {0} files...{1}", pstFiles.Length, dupMode));

try
{
_cts = new System.Threading.CancellationTokenSource();
await Task.Run(() =>
await Task.Run(() =>
{
_pstService.MergeFiles(pstFiles, destFile, _cts.Token, (progress, message) =>
{
this.Invoke(new Action(() =>
{
Log(message);
if (progress > 0) progressBar.Value = Math.Min(progress, progressBar.Maximum);
}));
});
_pstService.MergeFiles(pstFiles, destFile, _cts.Token, (progress, message) =>
{
this.Invoke(new Action(() =>
{
Log(message);
if (progress > 0) progressBar.Value = Math.Min(progress, progressBar.Maximum);
}));
}, removeDups);
});

if (_cts.Token.IsCancellationRequested)
Expand All @@ -167,6 +167,7 @@ await Task.Run(() =>
{
btnStartMerge.Enabled = true;
btnFixRegistry.Enabled = true;
chkRemoveDuplicates.Enabled = true;
btnCancel.Visible = false;
if (_cts != null) _cts.Dispose();
}
Expand All @@ -191,8 +192,6 @@ private void Log(string message)
}
string line = string.Format("[{0:HH:mm:ss}] {1}", DateTime.Now, message);
txtLog.AppendText(line + Environment.NewLine);

// Persistent File Logging
try { File.AppendAllText(_logFile, line + Environment.NewLine); } catch { }
}

Expand All @@ -203,6 +202,7 @@ private void btnAbout_Click(object sender, EventArgs e)

string about = string.Format("PST Merge Tool v{0}\n\n", displayVersion) +
"Developed by: Mithun\n" +
"Enhanced by: Eslam Omar (ADD REMOVE DUPLICATES)\n" +
"© DataGuardNXT 2026\n\n" +
"All Rights Reserved.\n\n" +
"Enterprise-grade PST merging solution\n" +
Expand All @@ -211,3 +211,4 @@ private void btnAbout_Click(object sender, EventArgs e)
}
}
}

Loading