检测C#中的文件读取

Pet*_*y B 8 c# file-io filesystemwatcher

我正在使用FileSystemWatcher检查文件被修改或删除的时间,但我想知道是否有任何方法可以检查其他应用程序何时读取文件.

示例:我的硬盘驱动器上有文件C:\ test.txt,正在使用FileSystemWatcher查看它.另一个程序(不在我的控制之下)去读取该文件; 我想抓住该事件,如果可能的话,检查正在读取文件的程序,然后相应地修改文件的内容.

Kei*_*thS 4

听起来您想在从外部读取日志文件时写入日志文件,或者类似的效果。如果是这种情况,则会有一个 NotifyFilters 值 LastAccess。确保将其设置为 FileSystemWatcher.NotifyFilter 属性中的标志之一。最后访问时间的更改将触发 FileSystemWatcher 上的 Changed 事件。

目前,FileSystemWatcher 不允许您直接区分读取和更改;它们都根据 LastAccess 的“更改”触发 Changed 事件。因此,监视对大量文件的读取是不可行的。但是,您似乎知道正在观看哪个文件,因此如果您有该文件的 FileInfo 对象,并且 FileSystemWatcher 触发了其 Changed 事件,您可以获得一个新的事件并比较 LastAccessTime 值。如果访问时间发生变化,而 LastWriteTime 没有变化,则您的文件仅被读取。

现在,用最简单的术语来说,您在读取文件时对文件所做的更改不会立即显示在其他应用程序中,您也无法“先到达那里”、锁定文件并写入文件在他们看到之前。因此,您不能使用 FileSystemWatcher 来“拦截”读取请求并显示您希望该应用程序看到的内容。另一个应用程序的用户可以看到您刚刚编写的内容的唯一方法是该应用程序也在监视该文件并重新加载该文件。这将触发另一个 Changed 事件,只要其他应用程序继续重新加载文件,就会导致无限循环。

您还将获得一个读取和写入的 Changed 事件。如果您正在查找上次访问时间的更改,则在文本编辑器中打开文件(几乎任何都可以),进行一些更改,然后保存将触发两个 Changed 事件。当编辑器打开文件时,第一个将响起;那时,您可能无法判断是否会发生写入,因此,如果您正在寻找对文件的纯只读访问,那么您就很成功了。