この投稿にFileSystemWatcher
示されているように、Windows のディスク キャッシュが原因で、信頼性が低くなります。ポスターは、クラスが最適化とInternalBufferSizeに関係なく、すべてのイベントの約 0.15% ~ 0.35% を見逃すことを示しました。ドライバーでさえこれに悩まされているため、本質的に FileSystemWatcher のせいではありません。
ポスターは、この問題に対処する方法を提案しています-ボリューム全体をフラッシュします。しかし、私はそれをしたくありません-キャッシュには理由があり、管理者権限が必要です。監視されているディレクトリだけをフラッシュして、FileSystemWatcher を 100% 正確にするのと同じ結果を達成することは可能ですか? FlushFileBuffersについてはあまり知りませんが、ディレクトリだけをフラッシュする方が明らかに優れたソリューションであっても、ポスターのソリューションはボリューム全体を具体的にフラッシュします。
ディレクトリまたは指定されたファイル (開かれていない) をフラッシュする .NET の方法はありますか? ディスク自体からの確認を待つ本当のフラッシュを意味します。たとえば、FileStream.Flush(void)は .NET バッファーのみをフラッシュしますが、OS バッファーはフラッシュしません ( .NET 4 以降でtrue引数を指定したFileStream.Flush(bool)とは異なります)。他のアプリで開いているファイルをフラッシュしたい。
そうでない場合、FlushFileBuffers を使用してディレクトリをフラッシュすることも可能ですか (ファイルとボリュームのみをサポートしている可能性がありますが、これは奇妙です)。また、管理者モードでは Change Journal を使用できるため、管理者以外のソリューションも理想的です。