Eld*_*Mor 13 c# filesystemwatcher
我正在使用FileSystemWatcher监视文件夹,如下所示:
watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;
Run Code Online (Sandbox Code Playgroud)
当我在该文件夹中的记事本中打开一个新文件并保存时,我会收到通知.如果我继续写作然后保存,我会收到通知.如果我保存它关闭文件,我会收到通知.正是我想要的.
但是,事实证明,如果我在该文件夹中创建一个文件并将其共享模式设置为FileShare.Read,然后我写入它,则在文件关闭之前我不会收到任何通知.另一种解决方法是打开文件(例如在记事本中),这显然会导致其状态更新,然后我的监控应用程序会收到通知.另一种解决方法是我可以在Windows资源管理器中执行刷新,这再次导致文件状态更新.
有趣的是,如果我在进行更改时查看Windows资源管理器,我会注意到:
因此,我的监控应用程序似乎与Windows资源管理器共享相同的行为.我正在考虑运行一个只扫描文件夹中文件的线程,但我想知道在这种情况下是否还有更优雅的事情要做.
顺便说一下,我正在使用Win7,我不确定这个问题是否也会在其他Windows版本上发生.
谢谢!
编辑:在C++中使用ReadDirectoryChanges得到了相同的结果.实现我之前谈到的线程并没有帮助.我想知道Windows资源管理器中的F5究竟是做什么的,因为它确实会导致报告更改.
Eld*_*Mor 10
该问题的解决方案不是打开文件,而是实际从它们读取.它甚至可以读取一个字节,Windows缓存机制会将文件的内容写入磁盘,从而允许您读取它们.
我最终实现了一个遍历所有文件的线程,打开它们并从中读取一个字节.这导致它们发生更改,并在FileSystemWatcher对象中触发了该事件.
Windows资源管理器F5也能正常工作的原因是,Windows实际上会读取文件的内容以显示某些扩展内容(例如,缩略图).读取文件后,缓存首先写入磁盘,触发FSW中的事件.
| 归档时间: |
|
| 查看次数: |
5310 次 |
| 最近记录: |