3

2 つのハードディスク ボリューム (1 つはもう 1 つのバックアップ イメージ) があり、ボリュームを比較して、変更されたすべてのファイルを一覧表示し、ユーザーがロールバックしたいファイルを選択できるようにしたいと考えています。

現在、新しいボリュームを再帰的に調べて、各ファイルのタイムスタンプを古いボリュームのファイルと比較しています (古いボリュームの場合)。明らかに、これは大失敗のアプローチです。時間がかかりますし、間違いです!

それを行う効率的な方法はありますか?

編集:
- 私は FindFirstFile を使用しており、ボリュームを再帰的に処理し、各ファイルの情報を収集するのが好きです (それほど遅くはなく、ほんの数分です)。
- バックアップにボリューム シャドウ コピーを使用しています。
- バックアップ ボリュームがリモートにあるため、実際のボリュームを継続的に監視できません。

4

5 に答える 5

2

これの一部は、2 つのボリュームがどのように複製されるかに依存します。それらがファイル システムの観点から見た「真の」コピー (たとえば、シャドウ コピーやその他のブロック レベルのコピー) である場合、他の人が調査を提案している一般的なテクノロジである USN に関して、いくつかのトリッキーな小さなことを行うことができます。 . たとえば、 FSCTL_READ_FILE_USN_DATAのような API を見たいと思うかもしれません。その API を使用すると、ファイルの 2 つの異なるコピーを比較できます (ここでも、ブロック レベルのバックアップからの同じファイル参照番号を持つ同じファイルであると仮定します)。大部分をステートレスにしたい場合は、この API や類似の API が非常に役立ちます。私のアルゴリズムは次のようになります。

foreach( file in backup_volume ) {
    file_still_exists = try_open_by_id( modified_volume )
    if (file_still_exists) {
        usn_result = compare_usn_values_of_files( file, file_in_modified_volume )
        if (usn_result == equal_to) {
           // file hasn't changed at all
        } else {
           // file has changed (somehow)
        }
    } else {
        // file was deleted (possibly deleted and recreated)
    }
}
// we still don't know about files new in modified_volume

そうは言っても、私の経験から、これは私の即席の説明が示唆するよりも複雑になると私は信じています. ただし、これは良い出発点かもしれません。

ボリュームが互いのブロック レベルのコピーでない場合、不可能ではないにしても、USN 番号とファイル ID を比較することは非常に困難です。代わりに、ファイル名で行っている可能性が非常に高く、すべてのファイルを開かずに行うことは不可能ではないにしても困難です (時間はアプリで変更でき、サイズと時間は findfirst/next クエリで古くなっている可能性があり、削除されてから再作成されたケースを処理したり、ケースの名前を変更したりする必要があります)。

そのため、環境をどの程度制御できるかを知ることは非常に重要です。

于 2010-08-29T00:54:00.460 に答える
1

変更が発生するまで待ってから、ディスク全体をスキャンして変更された (通常は少数の) ファイルを見つける代わりに、変更が発生したときに監視するために使用するプログラムをセットアップReadDirectoryChangesWます。これにより、最小限の手間でファイルのリストを作成できます。

于 2010-08-28T19:34:55.150 に答える
0

私は Windows プログラマーではありません。ただし、ファイルの変更時刻を取得するための stat 関数は必要ありません。mod 時間に基づいてファイルを並べ替えます。mod 時間が最後のバックアップ時間よりも長いファイルは、関心のあるファイルです。

初めて、バックアップ ボリュームを反復処理して、関心のあるセットからの最大 mod 時間と作成時間を把握できます。対象のディレクトリがバックアップ ボリュームで変更されないと想定しています。

于 2010-08-28T18:54:59.873 に答える
0

新しいボリュームの各ファイルをスナップショットのすべてのファイルと比較しないと仮定すると、それが唯一の方法です。すべてのファイルを確認せずに、どのファイルが変更されていないかをどのように見つけますか?

于 2010-08-28T18:04:31.120 に答える
0

ここで何をしようとしているのかについての詳細を知らなければ、なんとも言えません。ただし、達成しようとしていると思われることに関するいくつかのヒント:

  • NTFS ボリュームだけに関心がある場合は、USN / 変更ジャーナル API を調べることをお勧めします。それらは 2000 年から存在しています。このように、最初のインベントリの後は、その時点からの変更のみを見ることができます。これは良い出発点ですが、非常に古い記事がここにあります: http://www.microsoft.com/msj/0999/journal/journal.aspx
  • また、USN API を利用して、ハッシュ ステップを省略し、ジャーナルからの情報を自分で記録することもできます (これは、前述の API を調べると、より明確になります)
  • 初めてドライブの内容を比較するときは、SHA-1 や MD5 などのハッシュを使用します。
  • ハッシュやその他の情報を何らかのデータベースに保存します。たとえば、SQLite3 です。これ自体が膨大なスペースを占める可能性があることに注意してください。40,000 以上のファイルを含むオーディオ フォルダーをざっと見てみると、約 750 MB の MD5 情報が表示されます。
于 2010-08-28T20:10:47.100 に答える