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

前回は設定だけで実際にバックアップをする処理はしませんでした。今回は実際に指定されたフォルダにバックアップします。

仕様ですが、バックアップ先フォルダのなかに現在時刻を利用して新しいフォルダを作成します。そしてそこにバックアップ元フォルダ内のフォルダとファイルをバックアップします。

バックアップするだけなら以下のコードでよさそうです。

しかし今回は増分バックアップなので初回はフルバックアップでよいのですが、次回以降は前回の実行時には存在しなかったファイル、更新されているファイルだけを選ぶ必要があります。そこで以下のようなコードはどうでしょうか?

GetSourceFolderPath()メソッドとGetTargetFolderPath()メソッドでバックアップに関するフォルダのパスを取得します。このときリストビューコントロールで選択されている項目が存在しないと処理はおこなわれません。

バックアップ先フォルダは現在時刻を利用して作成するので、そのためのメソッドを示します。

増分バックアップでは実際にファイルやフォルダをバックアップする必要があるかどうかを判断しなければなりません。そこでバックアップをしたらファイルのパスと更新時刻をログとして保存します。バックアップを実行するときは前回分のログがあるかどうかを確認します。そのためのメソッドがGetLastLogFilePath(string targetFolder)メソッドです。

もし前回のバックアップのログファイルが存在する場合は、記録しておいたファイルパスと最終更新時刻のリストを取得します。

これはファイルパスと最終更新時刻を管理するためのクラスです。

CreateFileAndTimes(string logFilePath)メソッドは、前回のバックアップのログファイルからバックアップされているファイル・フォルダのパスと最終更新時刻のリストを取得するためのメソッドです。

ファイル・フォルダのパスと最終更新時刻のリストが取得できたら、ここからバックアップが必要なファイルとフォルダが存在するかどうかを調べます。DoesNeedBackup(List<FileAndTime> fileAndTimes, string[] folderPaths, string[] filePaths)メソッドはそのためのものです。

新しく作成されたり更新されていなくても削除されたファイルがあるかもしれません。そこでfolderPaths.Length と filePaths.Length の合計が fileAndTimes.Count と等しいか調べています。

異なっているのであればバックアップの処理が必要です。同じである場合はログファイルに記録されていた最終更新時刻とバックアップ元のファイルの最終更新時刻を比較します。後者のほうが時刻が後である場合はバックアップが必要です。

ここではバックアップするファイルまたはフォルダがひとつ以上存在するかどうかのみ調べています。

あとは実際に新しく作成されたファイルや更新されていたファイルがあればバックアップ先フォルダ内にコピーします。

以下はログと差分をファイルとして保存するためのメソッドです。

次回はバックアップ先からファイルを復元する処理を考えます。