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

復元処理をしたいとき、復元したいファイルはひとつだけとか、バックアップ対象フォルダのなかに存在するひとつのフォルダだけということもあります。復元日時を指定してすべてのフォルダとファイルを復元するのは時間がかかるので、ピンポイントで処理をしたいときがあります。

そこでバックアップしたファイルのうち一部だけを復元できる機能を追加することにします。

以下のようなフォームを作成します。

上のリストボックスには指定されているフォルダの直下のファイルとフォルダが表示され、下のリストボックスには現在のフォルダの直下にあるフォルダが表示されます。下のリストボックスでアイテムを選択して[フォルダを開く]をクリックするとそのフォルダを開くことができます。[上へ移動]をクリックするとひとつ上のフォルダに戻ることができます。

上のリストボックスのアイテムを選択すれば選択されたファイルまたはフォルダをピンポイントで復元する処理がはじまります。

ますFormPartRestoreを生成するときはフィールド変数 fileListにログファイルの内容をセットします。この情報をみてFormPartRestoreは上下のリストボックスにファイルたフォルダを表示させます。

まずフォームがロードされたらフィールド変数 fileListを利用してバックアップ可能なファイルとフォルダのリストを作成します。1行1行分解して最初の行を調べればバックアップ元のフォルダのパスがわかります。これに「\」を追加した文字列を取り除き、残された文字列のなかに「\」が存在しないのであればフォルダ内直下にあるフォルダかファイルのパスであると考えられます。これをりすリストボックスに表示させます。

下側のリストのアイテムが選択されている状態で[フォルダを開く]がクリックされたら、現在のフォルダパスに「\」と選択されたアイテムの文字列を追加することで移動先のフォルダのパスを取得できます。これを一番上にあるテキストボックスに表示して現在の位置がわかるようにするとともに、filePathsリストのなかから現在のパス+¥をもつ文字列があるか調べます。これが現在のフォルダの直下または配下に存在するファイルとフォルダのパスです。

リストボックスに表示させたいのは現在のフォルダの配下に存在するすべてのファイルとフォルダではなく、直下にあるファイルとフォルダです。これも現在のフォルダパスに¥を追加したものを取り除き、残された文字列のなかに¥が存在するかどうかで、直下に存在するファイルとフォルダなのか区別できます。

直下に存在するファイルとフォルダのパスが取得できたら、これを上下のリストボックスに表示させます。

ひとつ上のフォルダに移動する場合も同じような処理です。FileInfoクラスをつかえば指定したパスの親フォルダのパスを取得できます。これをつかって移動先の直下にあるファイルとフォルダをリストボックスに表示させています。

[選択]をクリックしたら確認のためのメッセージボックスを表示し、[OK]がクリックされたら処理を開始します。

上記のフォームはメインフォームのメニュー [バックアップ先から復元] を選択したときに表示される以下のフォームでボタンをクリックしたときに表示されます。そこでFormRestoreクラスも変更します。

チェックボックス[一部のファイル・フォルダだけ復元]がチェックされているとき、[復元の対象を指定する]ボタンが有効になります。このときに同ボタンをクリックすると上記のフォームが表示されます。

ChangeButtonSelectFileFolderEnabled()メソッドは、チェックボックス[一部のファイル・フォルダだけ復元]がチェックされているかどうかで[復元の対象を指定する]ボタンの状態を変えます。

[復元の対象を指定する]ボタンをクリックするとファイルやフォルダをピンポイントで指定して復元するためのフォームが表示されます。そして適切な値が設定されている状態でフォームが消滅するとみずからも消滅して、バックアップの処理が開始されます。

[バックアップ先から復元] を選択したときに表示されるフォームでファイルやフォルダをピンポイントで指定して復元する処理が選択された場合はそのための処理をおこなえるようにしなければなりません。

FormRestoreクラスのフィールド変数 SelectedSourcePartPathの文字列が空かどうかでその判断をしています。すべて復元するのではなく一部のファイルやフォルダだけを復元する場合はRestoreFilesメソッドではなく、RestorePartFilesメソッドで処理がおこなわれます。

最後にこれが指定されたファイル・フォルダを一部だけ復元するメソッドです。