由于Windows磁盘缓存而在this post, FileSystemWatcher
is unreliable中显示。海报显示,无论优化和InternalBufferSize,班级都错过了大约0.15% - 0.35%的所有事件。即使是驱动程序也会受此影响,因此它本身并不是FileSystemWatcher的错误。
海报提出了解决这个问题的方法 - 冲洗整个卷。但是我不想这样做 - 缓存是有原因的,它需要管理员权限。是否可以只刷新被监视的目录并获得使FileSystemWatcher 100%准确的相同结果?我对FlushFileBuffers了解不多,但是海报的解决方案专门刷新整个卷,即使只是刷新目录显然是一个更好的解决方案。
是否有任何.NET方法来刷新目录或指定文件(未打开)?我的意思是真正的刷新,等待来自磁盘本身的确认。例如,FileStream.Flush(void)只刷新.NET缓冲区,但不刷新OS缓冲区(与.NET 4中的 true 参数的FileStream.Flush(bool)不同)。我想刷新其他应用程序打开的文件。
如果没有,是否甚至可以使用FlushFileBuffers来刷新目录(也许它只支持文件和卷,但这会很奇怪)?此外,非管理员解决方案将非常理想,因为在管理模式下,我可以使用Change Journal。