次のような FileSystemWatcher を使用してフォルダーを監視しています。
watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;
そのフォルダーのメモ帳で新しいファイルを開いて保存すると、通知が表示されます。書き続けて保存すると、通知が届きます。ファイルを保存して閉じると、通知が表示されます。まさに私が欲しかったもの。
ただし、そのフォルダーにファイルを作成し、その共有モードを FileShare.Read に設定して書き込みを行うと、ファイルが閉じられるまで通知が届かないことがわかりました。もう 1 つの回避策は、(メモ帳などで) ファイルを開くことです。これにより、ファイルの状態が明らかに更新され、監視アプリケーションが通知を受け取ります。さらに別の回避策は、Windows エクスプローラーで実行できる更新です。これにより、ファイルの状態が更新されます。
興味深いことに、変更中に Windows エクスプローラーを見ると、次のことがわかります。
- ファイルが読み取りと書き込みのために共有されている場合、ファイルを保存するとすぐに、そのサイズが Windows エクスプローラーですぐに更新されます。
- ファイルが読み取り専用で共有されている場合、ウィンドウを手動で更新しない限り、そのサイズは Windows エクスプローラーですぐには更新されません。
したがって、私の監視アプリケーションは、Windows エクスプローラーと同じ動作を共有しているようです。フォルダー内のファイルをスキャンするだけのスレッドを実行することを考えていましたが、この場合、もっと洗練された方法があるかどうか疑問に思っています。
ところで、私は Win7 を使用していますが、この問題が他の Windows バージョンでも発生するかどうかはわかりません。
ありがとう!
編集: C++ で ReadDirectoryChanges を使用すると、まったく同じ結果が得られました。先ほど話したスレッドの実装も役に立ちませんでした。Windows エクスプローラーで F5 キーを押すと、変更が報告されるため、実際に何をしているのか気になります。