これの一部は、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 クエリで古くなっている可能性があり、削除されてから再作成されたケースを処理したり、ケースの名前を変更したりする必要があります)。
そのため、環境をどの程度制御できるかを知ることは非常に重要です。