我正在使用这样的 FileSystemWatcher 监视文件夹:
watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;
当我在该文件夹中的记事本中打开一个新文件并保存它时,我会收到一条通知。如果我继续写然后保存,我会收到通知。如果我关闭文件并保存它,我会收到通知。正是我想要的。
但是,事实证明,如果我在该文件夹中创建一个文件并将其共享模式设置为 FileShare.Read,然后写入它,则在文件关闭之前我不会收到任何通知。另一种解决方法是打开文件(例如在记事本中),这显然会导致其状态被更新,然后我的监控应用程序会收到通知。另一个解决方法是我可以在 Windows 资源管理器中进行刷新,这再次导致文件状态被更新。
有趣的是,如果我在进行更改时查看 Windows 资源管理器,我会注意到:
- 如果文件被共享用于读写,一旦我保存它,它的大小将立即在 Windows 资源管理器中更新。
- 如果文件共享为只读,它的大小不会在 Windows 资源管理器中立即更新,除非我手动刷新窗口。
因此,我的监控应用程序似乎与 Windows 资源管理器具有相同的行为。我正在考虑运行一个只扫描文件夹中文件的线程,但我想知道在这种情况下是否有更优雅的事情要做。
顺便说一句,我使用的是 Win7,我不确定其他 Windows 版本是否也会出现此问题。
谢谢!
编辑:在 C++ 中使用 ReadDirectoryChanges 得到了相同的结果。实现我之前谈到的线程也没有帮助。我想知道 Windows Explorer 中的 F5 实际上在做什么,因为它确实会导致报告更改。