ソースコードはこちら
https://github.com/mi3w2a1/incremental-backup
ファイルのバックアップを繰り返していると復元可能なポイントが増えていき、このようになります。
そこで必要のない復元ポイントは表示されないようにしてしまいましょう。
前回のバックアップと比較して変更点があるときだけバックアップしているので、その部分を削除してしまっても他のファイルを復元できるようにしておく必要があります。
復元ポイントを削除するということはファイル復元のために必要なファイルが入っているフォルダを削除することを意味しています。そこで次世代のフォルダにファイルを移動させることにします。もし移動先にすでにファイルが存在する場合はそれは更新されたファイルなので、更新したファイルが無効にならないように上書きはしないようにします。そうすれば復元ポイントが削除されても問題ありません。
バックアップ用のフォルダとログと差分が記録されたファイルは削除します。ただ困ったことにアンチウイルスソフトによってはウイルスと検知されてしまうことがあります。ノートンセキュリティオンラインではデータプロテクタが有効になっていると疑わしい処理とみなされて遮断されてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class Form1 : Form { private void RestoreFilesMenuItem_Click(object sender, EventArgs e) { // // ここから上は前回と同じ FormRestore form = new FormRestore(); form.TicksList = ticksList; form.ShowDialog(this); // ShowDialogメソッドの引数に this を渡しているのが変更点 // ここから下は前回と同じ // } } |
FormRestoreクラスにボタンを追加します。
ボタンがクリックされたらリストボックスの上から何番目が選択されているかを調べて、復元可能な日時のリストから削除されようとしている復元ポイントの日時と、バックアップ情報が記録されているフォルダを調べます。
バックアップ情報が記録されているフォルダとひとつ次の世代のフォルダのパスを求め、前者から後者へファイルを移動させます。
Form1クラスのGetFolderPathFromTicksメソッド、GetLogFilePathFromTicksメソッド、GetDifferenceFilePathFromTicksメソッドにアクセスできるようにアクセス修飾子をpublicに変更してください
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 |
public partial class FormRestore : Form { private void ButtonRemoveRestorePoint_Click(object sender, EventArgs e) { int i = listBox1.SelectedIndex; if(i != -1) { Form1 form1 = (Form1)Owner; if(i - 1 >= 0) { // 項目に対応するフォルダはどれか? string removeFolder = form1.GetFolderPathFromTicks(TicksList[i]); string moveToFolder = form1.GetFolderPathFromTicks(TicksList[i-1]); // 移動させるフォルダのパスをすべて求める string[] folderPaths = Directory.GetDirectories(removeFolder, "*", SearchOption.AllDirectories); foreach(string path in folderPaths) { string newPath = path.Replace(removeFolder, moveToFolder); if(!Directory.Exists(newPath)) Directory.CreateDirectory(newPath); } // 移動させるファイルのパスをすべて求める string[] moveFromPaths = Directory.GetFiles(removeFolder, "*", SearchOption.AllDirectories); foreach(string path in moveFromPaths) { string newPath = path.Replace(removeFolder, moveToFolder); // 移動先に同じファイルが存在するのであれば移動しない。 if(!File.Exists(newPath)) { // 移動元にファイルが存在することを確認する。 if(File.Exists(path)) { FileInfo info = new FileInfo(newPath); if(!Directory.Exists(info.DirectoryName)) Directory.CreateDirectory(info.DirectoryName); // ひとつ次の世代のフォルダに移動。 // これがアンチウイルスソフトには怪しく見えるらしい。 File.Move(path, newPath); } } } // ログファイルと差分記録ファイルを削除する。 // これもアンチウイルスソフトには怪しく見えるらしい。 string delFilePath = form1.GetLogFilePathFromTicks(TicksList[i]); File.Delete(delFilePath); delFilePath = form1.GetDifferenceFilePathFromTicks(TicksList[i]); File.Delete(delFilePath); // バックアップ情報を保存しているフォルダを削除する。 // これもアンチウイルスソフトには怪しく見えるらしい。 Directory.Delete(removeFolder, true); TicksList.RemoveAt(i); listBox1.Items.RemoveAt(i); if(i - 1 >= 0) listBox1.SelectedIndex = i - 1; } else MessageBox.Show("これは削除できません!"); } } } |