【问题标题】:Watch folder for files being Read监视正在读取的文件的文件夹
【发布时间】:2011-06-21 22:47:22
【问题描述】:

我正在尝试监视目录中的文件以确定何时打开/访问文件。我认为FileSystemWatcher 会使用事件Changed 来解决问题。

问题是某些应用程序不会在它们打开/访问的文件上创建锁定或更改修改日期或访问日期(即使在fsutil behavior set disablelastaccess 0 之后)。以记事本为例。显然是在内存中复制文件并在那里播放,直到你保存它。它也不会更新访问日期。

如何监视文件目录并在任何程序(例如记事本)简单地打开/访问文件时收到通知?文件可以从另一台计算机打开,不一定在计算机上运行“观察者”。

我发现了很多类似的问题,但没有看到一个关注文件“访问”的问题。

【问题讨论】:

标签: vb.net windows-7 file-io


【解决方案1】:

这很正常。更新现有文件非常危险,因为它可能导致无法挽回的数据丢失。写入时出现磁盘错误(如磁盘已满)是非常坏的消息。常用算法:

  • 重命名原始文件
  • 用原来的名字写一个新的文件
  • 没有错误:删除重命名的文件
  • 错误:删除新文件,重命名原文件

显然这不会引发 Changed 事件,没有文件被更改。


抱歉,我没有很好地阅读这个问题。对于仅打开文件进行阅读的应用程序,没有任何通知。 FSW 只能检测文件系统的更改。也没有现成的替代方案,这需要一个自定义文件系统过滤器驱动程序来监听驱动程序请求。就像 SysInternals 的 ProcMon 实用程序使用的那种。我不知道有这样的驱动程序可以在 C# 程序中使用,你也不能用 C# 编写它们。这只是不常见的要求。

【讨论】:

  • 当您对文件进行少量更改时,这会引入大量开销。你说这很常见。哪些程序实际上会执行这样的文件写入操作?
  • 此外,kez 询问如何在访问文件时获得通知,而不是重命名/覆盖/更改。这根本不能回答问题(这是有用的信息,只是不是答案)。
  • @Sam - 我的,够了。 OP 需要弄清楚如何以一种聪明的方式使用 OnRenamed 通知。确定这就是您要寻找的答案吗?这是暗示的。
  • @Hans Passant,OP 正在询问一个只读取文件的应用程序。仅读取文件如何触发 OnRenamed?
  • 嗯,好吧,被“直到你保存它”抓住了。 FSW 无法检测仅读取文件的应用程序。也别无选择。
猜你喜欢
  • 2013-01-18
  • 2019-03-09
  • 2022-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多