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イベントが発生した場合、それがファイルの作成であったことは間違いありません。