ファイルシステムのインデックスを作成するプログラムは、最後のインデックス以降に変更された部分を認識しているようで、その部分のみを再スキャンします。前回のインデックス以降にファイルシステム/ファイルが変更された場所を特定するにはどうすればよいですか? どの言語で答えても構いませんが、私は c と Windows を考えています。
このようなプログラムの例として、ハードディスクのツリーマップを生成する Sequoia View があります。
ファイルシステムのインデックスを作成するプログラムは、最後のインデックス以降に変更された部分を認識しているようで、その部分のみを再スキャンします。前回のインデックス以降にファイルシステム/ファイルが変更された場所を特定するにはどうすればよいですか? どの言語で答えても構いませんが、私は c と Windows を考えています。
このようなプログラムの例として、ハードディスクのツリーマップを生成する Sequoia View があります。
かなり単純な方法は、ファイル システムの報告されたファイル サイズ、日付 (整数値として)、および特定のディレクトリ内のファイル名を取得し、そのディレクトリに関連付けることができるチェックサムを計算することです。ファイル システム データを使用してすべてのディレクトリに対してこの計算を実行する必要がありますが、チェックサムが違いを報告しない限り、詳細に調べる (ファイルを開いて違いを確認する) 必要はありません。
ファイル レベルで特定の変更を追跡するには、個々のファイル属性に基づいてチェックサムを保存します。もちろん、最後のスキャン以降のファイルとサブディレクトリの有無も保存します。
あらゆる種類の属性を変更するためのファイル システム ユーティリティがあるため、変更が発生していないことを必ずしも保証するものではありませんが、基本的なスキャンの最初のステップとしては適切です。
ここで対処する 2 つの問題があります。
1 つ目は、動的な変更 (プログラムの実行中に行われる変更) を監視する場合です。その場合、Windows API ReadDirectoryChangesW を使用する必要があります。それを使用する方法については、オンラインの例がたくさんあります。(注意してください... いくつかの例はあまり良くありません。この API 呼び出しは、各呼び出しに対して複数のイベントを返すことができます。インターフェイスを注意深く読んで、その仕組みを理解し、返されたものすべてを処理する必要があります。
2番目の問題は、フォルダーまたはフォルダーのリストがあり、そのフォルダー内のファイルを追加/削除または変更して、その内容が変更されたかどうかを確認したい場合です。
この場合、最も効果的な方法は、フォルダーの内容を一度にファイル名ごとに読み取り、累積ハッシュを作成することです。ただし、それ以上に、(GetFileAttributesEx などを使用して) 属性を取得し、それらもハッシュに含める必要があります。(フォルダー「.」と「..」を必ず除外してください。そうしないと、誤解を招く結果になります。)
その理由は、ファイルの変更をサイズや日付などで把握したいからです。おそらく、LastAccessed 時刻を含めたくないでしょう。
どんな大きなハッシュ関数でもかまいません。結果は、フォルダーごとに 1 つの大きな数値 (ハッシュ) になります。
次に、別のパスを作成するときに、ハッシュを再計算し、そのフォルダーの最後の既知の状態について保存されているハッシュと比較します。ハッシュが一致しない場合は、フォルダーを詳しく調べる必要があります。
事実上、このアプローチは、ここにもっと詳細に調べる必要があるものがあることを (すばやく) 伝えます。その方法は、何を達成しようとしているかによって異なります。
これには、フォルダー内の各ファイルの内容を確認するのではなく、十分な指標を提供するメタデータを確認するという利点があります。したがって、処理は何千倍も速くなります。
.Net マネージ言語でコーディングしていた場合は、 FileSystemWatcherクラスを試してください。
MSDN から:
FileSystemWatcher を使用して、指定したディレクトリの変更を監視します。指定したディレクトリのファイルとサブディレクトリの変更を監視できます。ローカル コンピューター、ネットワーク ドライブ、またはリモート コンピューター上のファイルを監視するコンポーネントを作成できます。
すべてのファイルの変更を監視するには、Filter プロパティを空の文字列 ("") に設定するか、ワイルドカード (" . ") を使用します。特定のファイルを監視するには、Filter プロパティをファイル名に設定します。たとえば、ファイル MyDoc.txt の変更を監視するには、Filter プロパティを "MyDoc.txt" に設定します。特定の種類のファイルの変更を監視することもできます。たとえば、テキスト ファイルの変更を監視するには、Filter プロパティを "*.txt" に設定します。
ディレクトリ変更通知を調べます。
Linux (およびその他の Unix ライクな OS) では、ファイル/フォルダーのハッシュ値を生成して、特定の時点での状態を表すことができます。後で、ハッシュを再生成して、それを古い値と比較します。これは、私が取り組んでいたいくつかのプロジェクトで非常に効果的であることが証明されました!
詳細はこちら: http://vpalos.com/169/recursive-filedirectory-change-detection/
基本的にあらゆる変更に敏感です (ファイルのアクセス時間のみを変更する場合でも)。
FindFirstChangeNotification