2

FileSystemWatcher通知をサブスクライブしているときはいつでも、新しいファイルを作成したり、既存のファイルを変更したりすると、複数のイベントが発生します。イベントは次の順序で発生しています。

新しいファイル

作成した

かわった

かわった

かわった

かわった

かわった

かわった

変化する

かわった

削除

かわった

名前を変更

名前を変更

消去

削除

名前の変更と削除は期待どおりに機能しています。CreatedとChangedは複数回呼び出されます。

ファイルが追加/変更されたときに正確な通知を受け取るための解決策/回避策はありますか?

4

1 に答える 1

3

FSWのSDFソースコードを見ると、実際には、dwEventMaskがSHCNE_ALLEVENTSに設定されたネイティブのSHChangeNotifyRegister呼び出しの周りのかなり薄いマネージドシムであることがわかります。ウィンドウハンドルがAPIに渡され、APIは変更が発生したときにコールバックを受け取り、それらのコールバックはFSWが管理側で公開する管理対象イベントにマーシャリングされます。

コールバックを見ると、ハンドルである9つのイベントIDがあり、そのうちの4つがChangedイベントを発生させているようです。

  • SHCNE_UPDATEDIR
  • SHCNE_RMDIR
  • SHCNE_UPDATEITEM
  • SHCNE_ATTRIBUTES

したがって、新しいファイルを作成すると、SHCNE_CREATEによってCreatedイベントが提供され、その後にいくつかのChangedイベントを発生させる他のコールバックが続きます。変更イベントのすべてのイベント引数は同じですか?そうである場合は、デバッガーを使用してSDFコードをステップ実行し、何が入ってくるのか、どの実際のコールバックに対応するのかを正確に確認する必要があります。

ここでの簡単な話は、SDFがOSから提供されているイベントを転送しているだけであるということです。これらのイベントがすべて表示されるのは、OSがそれらを送信しているためです。それらを送信する正確な理由は、OSがファイルを処理する方法である場合もあれば、使用しているファイルシステムドライバーに固有である場合もあります(つまり、別のデバイスではわずかに異なる場合があり、さらには同じデバイス)。

回避策は、イベント引数を調べて、すばやく連続して発生する同じファイル名のイベントを「グループ化」することだと思います。たとえば、同じフォルダ内の同じファイル名に対して1秒以内に大量のChangedイベントとCreatedイベントが発生した場合、それがファイルの作成であったことは間違いありません。

于 2010-10-13T04:48:49.940 に答える