gpt4 book ai didi

c# - FileSystemWatcher 不报告锁定文件中的更改

转载 作者:可可西里 更新时间:2023-11-01 08:06:01 26 4
gpt4 key购买 nike

我正在使用 FileSystemWatcher 监控文件夹,如下所示:

watcher = new FileSystemWatcher(folder);
watcher.NotifyFilter = NotifyFilters.Size;
watcher.Changed += changedCallback;

当我在该文件夹中的记事本中打开一个新文件并保存它时,我会收到一条通知。如果我继续写然后保存,我会收到通知。如果我通过保存关闭文件,我会收到一条通知。正是我想要的。

然而,事实证明,如果我在该文件夹中创建一个文件并将其共享模式设置为 FileShare.Read,然后我写入它,那么在文件关闭之前我不会收到任何通知。另一种解决方法是打开文件(例如在记事本中),这显然会导致其状态更新,然后我的监控应用程序会收到通知。另一种解决方法是我可以在 Windows 资源管理器中进行刷新,这会再次导致文件状态更新。

有趣的是,如果我在进行更改时查看 Windows 资源管理器,我会注意到:

  1. 如果共享文件以供读写,我一保存它,它的大小就会立即在 Windows 资源管理器中更新。
  2. 如果共享文件只供阅读,它的大小将不会在 Windows 资源管理器中立即更新,除非我手动刷新窗口。

看来我的监控应用程序与 Windows 资源管理器具有相同的行为。我正在考虑运行一个只扫描文件夹中文件的线程,但我想知道在这种情况下是否还有更优雅的事情要做。

顺便说一句,我使用的是 Win7,我不确定这个问题是否也发生在其他 Windows 版本上。

谢谢!

编辑:在 C++ 中使用 ReadDirectoryChanges 得到了完全相同的结果。实现我之前谈到的线程也没有帮助。我想知道 Windows 资源管理器中的 F5 实际上在做什么,因为它确实会导致报告更改。

最佳答案

问题的解决方案不是打开文件,而是实际读取文件。读取一个字节就足够了,Windows缓存机制会将文件的内容写入磁盘,从而允许您读取它们。

我最终实现了一个遍历所有文件的线程,打开它们并从中读取一个字节。这导致它们发生变化,并触发了 FileSystemWatcher 对象中的事件。

Windows 资源管理器 F5 也能正常工作的原因是 Windows 实际上读取文件的内容以显示一些扩展内容(例如,缩略图)。一旦文件被读取,缓存首先写入磁盘,触发 FSW 中的事件。

关于c# - FileSystemWatcher 不报告锁定文件中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com