ソースコードはこちら
https://github.com/mi3w2a1/incremental-backup
バックアップされているファイルを復元するときもファイルの数やサイズによって時間がかかります。そこでプログレスバーで進行状況がわかるようにするとともに途中で中止することができるようにします。
これがバックアップされているファイルを復元するときに表示されるプログレスバー付きのダイアログです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
public partial class FormRestoreProgress : Form { public FormRestoreProgress() { InitializeComponent(); } new public void Show() { Task.Run(()=> { ShowDialog(); }); } public bool RestoreCancel = false; private void button1_Click(object sender, EventArgs e) { if(MessageBox.Show("処理を中止しますか?", "", MessageBoxButtons.YesNo) == DialogResult.Yes) RestoreCancel = true; } protected override void OnClosing(CancelEventArgs e) { if (RestoreCancel) { base.OnClosing(e); return; } if(MessageBox.Show("処理を中止しますか?", "", MessageBoxButtons.YesNo) == DialogResult.Yes) RestoreCancel = true; else e.Cancel = true; } public ProgressBar GetProgressBar() { return progressBar1; } // FormRestoreProgress.Designer.cs を編集する protected override void Dispose(bool disposing) { Invoke((System.Action)(() => { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); })); } } |
メニューで[バックアップ先から復元]を選択すると以下の処理がおこなわれます。やっていることは
とほとんど同じです。ファイルを実際に復元するときに呼び出されるRestoreFiles(folderPath, logPath, backupFolderPaths, GetSourceFolderPath())メソッドを、
1 2 3 4 5 6 |
Task.Run(() => { EnableMenu(false); RestoreFiles(folderPath, logPath, backupFolderPaths, GetSourceFolderPath()); EnableMenu(true); }); |
としている部分が違うだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
public partial class Form1 : Form { private void RestoreFilesMenuItem_Click(object sender, EventArgs e) { RestoreFiles(); } private void RestoreFiles() { string targetFolder = GetTargetFolderPath(); if(targetFolder == "") { MessageBox.Show("項目が選択されていません!", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if(!Directory.Exists(GetLogFolderPath(targetFolder))) { MessageBox.Show("バックアップは存在しません", "報告", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } List<long> ticksList = GetRestoreTicksList(targetFolder); FormRestore form = new FormRestore(); form.TicksList = ticksList; form.ShowDialog(); if(form.RestoreTime > 0) { string folderPath = form.SelectedPath; long time = form.RestoreTime; List<long> vs = form.TicksList; List<string> backupFolderPaths = GetBackupFolderPaths(time, vs); string logPath = GetLogFilePathFromTicks(time); Task.Run(() => { EnableMenu(false); RestoreFiles(folderPath, logPath, backupFolderPaths, GetSourceFolderPath()); EnableMenu(true); }); } form.Dispose(); } } |
RestoreFiles(string folderPath, string logFilePath, List<string> backupFolderPaths, string sourceFolderPath)メソッドもほとんど同じです。プログレスバー付きのダイアログを表示させ、プログレスバーで進行状況を表示する、処理が終わったらプログレスバー付きのダイアログを消滅させる処理を追加しているだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
public partial class Form1 : Form { void RestoreFiles(string folderPath, string logFilePath, List<string> backupFolderPaths, string sourceFolderPath) { FormRestoreProgress formRestoreProgress = new FormRestoreProgress(); formRestoreProgress.Show(); StreamReader sr = new StreamReader(logFilePath); string str = sr.ReadToEnd(); string[] vs1 = str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); Invoke((Action)(() => { Invoke((Action)(() => { formRestoreProgress.GetProgressBar().Value = 0; formRestoreProgress.GetProgressBar().Maximum = vs1.Length; })); })); foreach (string path in vs1) { if (formRestoreProgress.RestoreCancel) { System.Threading.Thread.Sleep(1000); Invoke((Action)(() => { formRestoreProgress.RestoreCancel = true; formRestoreProgress.Dispose(); })); MessageBox.Show("復元処理は中断されました", "", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Invoke((Action)(() => { Invoke((Action)(() => { formRestoreProgress.GetProgressBar().Value++; })); })); string[] vs2 = path.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries); if (vs2.Length != 2) { MessageBox.Show("ログファイルが破損しています!", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); Invoke((Action)(() => { formRestoreProgress.RestoreCancel = true; formRestoreProgress.Dispose(); })); return; } string filePath = vs2[0].Replace(sourceFolderPath, folderPath); bool isFind = false; foreach (string backupFolderPath in backupFolderPaths) { string backupFilePath1 = vs2[0].Replace(sourceFolderPath, backupFolderPath); if (File.Exists(backupFilePath1)) { File.Copy(backupFilePath1, filePath); isFind = true; break; } if (Directory.Exists(backupFilePath1)) { string newFolderPath = vs2[0].Replace(sourceFolderPath, folderPath); Directory.CreateDirectory(newFolderPath); isFind = true; break; } } if (!isFind) MessageBox.Show("エラー ファイルがみつからない", vs2[0], MessageBoxButtons.OK, MessageBoxIcon.Error); } System.Threading.Thread.Sleep(1000); Invoke((Action)(() => { formRestoreProgress.RestoreCancel = true; formRestoreProgress.Dispose(); })); MessageBox.Show("復元完了", "報告", MessageBoxButtons.OK, MessageBoxIcon.Information); } } |