ソースコードはこちら
https://github.com/mi3w2a1/incremental-backup

前回の続きです。バックアップ先からファイルを復元する処理を考えます。

[バックアップ先から復元]をクリックすると以下のようなダイアログを表示されます。このなかからバックアップされた時刻と復元先フォルダを指定すると、バックアップ先からファイルとフォルダが復元されます。

復元先フォルダは空のフォルダでなければなりません(復元先フォルダのなかに同名のファイルがあると処理が複雑になるので・・・)。

[復元]ボタンがクリックされると適切な値が設定されているか調べます。「適切」であるとは、復元時刻が指定されていること、復元先フォルダのパスが指定されていること、復元先フォルダは実際に存在し、中身は空であること、これらすべての条件を満たしていることです。そのときはダイアログは閉じられて、ファイルの復元の処理がはじまります。

[バックアップ先から復元]をクリックするとForm1クラスでは以下のメソッドが実行されます。

GetRestoreTicksList(string targetFolder)メソッドはログが保存されているフォルダからログファイルのパスを取得し、そのファイル名から復元可能な時刻をリストに格納します。ファイル名から復元可能な時刻を求めるのがGetTicksFromLogFilePath(string filePath)メソッドです。

復元可能な時刻がリストに格納されたら、これを上記のFormRestoreクラスのフィールド変数 FormRestore.TicksListにセットします。そのあとShowDialog()メソッドを実行してダイアログを表示させます。

ダイアログで適切な値が設定されていた場合([復元]ボタンがクリックされ、FormRestoreダイアログが正常に閉じられたときはFormRestore.RestoreTimeが0よりも大きな値になっている)は、ファイル復元の処理がおこなわれます。

ファイルを復元するためにはログファイルと GetRestoreTicksList(string targetFolder) で取得されたもののうち、FormRestore.RestoreTimeと同じものか、それよりも数値が小さいものを使います。まずFormRestore.RestoreTimeからバックアップしているフォルダパスを求め、そのフォルダのなかに復元しようとしているファイルがあるかどうか調べます。

GetBackupFolderPaths(long time, List<long> ticksList)メソッドは、指定された時刻からバックアップされているフォルダパスのリストを取得するためのメソッドです。

バックアップされているファイルが見つかった場合は復元先のフォルダにそのままコピーし、なければFormRestore.RestoreTimeに近い順にバックアップしているフォルダパスを求め、そこを探します。どこかでバックアップされているファイルとフォルダは見つかるはずなのですが、見つからない場合はエラーとなります。

これはファイルとフォルダがバックアップされているフォルダパスのリストから実際にファイルとフォルダを復元するためのメソッドです。

最後に[バックアップ先から復元]をクリックしたときにForm1クラスで呼び出されるメソッドを示します。