23

FileSystemWatcher は Move イベントを提供しないことに気付きました。代わりに、同じファイルに対して個別の Delete イベントと Create イベントを生成します。(FilesystemWatcher は、ソース フォルダーと宛先フォルダーの両方を監視しています)。

しかし、実際のファイルの移動と、最近削除されたファイルと同じ名前のファイルがランダムに作成されたものとは、どのように区別すればよいでしょうか?

"AssociatedDeleteFile" などの FileSystemEventArgs クラスのある種のプロパティは、削除されたファイル パスが移動の結果である場合は割り当てられ、それ以外の場合は NULL が割り当てられます。しかし、もちろんこれは存在しません。

また、FileSystemWatcher は基本的なファイルシステム レベルで動作しているため、「移動」の概念はより高いレベルのアプリケーションにとってのみ意味があることも理解しています。しかし、これが事実である場合、私のアプリケーションでこの状況を処理するために、どのような種類のアルゴリズムが推奨されるでしょうか?

フィードバックに基づく更新:

FileSystemWatcher クラスは、ファイルの移動を、元のファイルの削除とそれに続く新しい場所での作成という 2 つの異なるイベントとして認識しているようです。

残念ながら、これらのイベント間に「リンク」が提供されていないため、ファイルの移動と通常の削除または作成を区別する方法が明確ではありません。OS レベルでは、移動は特別に扱われ、たとえば 1GB のファイルをほぼ瞬時に移動できます。

イベント間でファイルを確実に識別するためにファイルのハッシュを使用することを提案したいくつかの回答があり、私はおそらくこのアプローチを採用します。しかし、より簡単に動きを検出する方法を誰かが知っている場合は、答えを残してください.

4

6 に答える 6

14

ドキュメントによると:

一般的なファイル システム操作では、複数のイベントが発生する場合があります。たとえば、あるディレクトリから別のディレクトリにファイルを移動すると、いくつかの OnChanged イベント、いくつかの OnCreated イベント、および OnDeleted イベントが発生する可能性があります。ファイルの移動は、複数の単純な操作で構成される複雑な操作であるため、複数のイベントが発生します。

したがって、移動の検出に細心の注意を払い、同じパスを使用するだけでは不十分な場合は、ある種のヒューリスティックを使用する必要があります。たとえば、ソース フォルダ内のファイルのファイル名、サイズ、最終変更時刻などを使用して「フィンガープリント」を作成します。移動の合図となる可能性のあるイベントが発生した場合は、新しいファイルに対して「フィンガープリント」を確認してください。

于 2009-08-17T04:22:38.287 に答える
4

私が理解している限り、Renamedイベントはファイルを移動するためのものです...?

私の間違い - ドキュメントでは、移動したフォルダー内のファイルのみがカットアンドペースト操作で「名前が変更された」と見なされると具体的に述べています。

オペレーティング システムと FileSystemWatcher オブジェクトは、カット アンド ペースト アクションまたは移動アクションを、フォルダーとその内容の名前変更アクションとして解釈します。ファイルを含むフォルダーを監視対象のフォルダーにカット アンド ペーストすると、FileSystemWatcher オブジェクトはフォルダーのみを新しいものとして報告しますが、基本的には名前が変更されるだけであるため、その内容は報告しません。

また、ファイルの移動についても述べています。

一般的なファイル システム操作では、複数のイベントが発生する場合があります。たとえば、あるディレクトリから別のディレクトリにファイルを移動すると、いくつかの OnChanged イベント、いくつかの OnCreated イベント、および OnDeleted イベントが発生する可能性があります。ファイルの移動は、複数の単純な操作で構成される複雑な操作であるため、複数のイベントが発生します。

于 2009-08-17T04:15:32.870 に答える
2

「移動」が実際に存在しないと推測する危険があります。そのため、「削除」を探して、そのファイルを「移動の可能性がある」ファイルとしてマークする必要があります。すぐ後にそれを「作成」すると、あなたが正しいと仮定できると思います。

動きの検出に影響を与えるランダムなファイル作成のケースはありますか?

于 2009-08-17T04:13:11.470 に答える
2

ドキュメントに記載されている OnChanged および/または OnRenamed イベントを試してみてください。

于 2009-08-17T04:17:53.897 に答える