每秒识别 FS(文件)的更改,强制文件创建的程序刷新写入缓冲区

问题描述 投票:0回答:1

我需要应用程序来识别文件系统的更改,特别是识别文件创建和更新。文本文件是由另一个应用程序创建的,并且在该应用程序完成之前不会关闭,但我以某种方式需要获取创建的文件附加内容。

我使用

FileSystemWatcher
观察文件系统,它捕获创建事件,但是我遇到了一个问题:

从逻辑上讲,如果另一个应用程序没有关闭该文件(并且其缓冲区尚未满),则写入的文件不会更新。目标磁盘上的

Write-VolumeCache
没有帮助,但如果我使用记事本打开创建的文件,那么我的应用程序会收到事件 - 这意味着应用程序有一些外部机制创建文件来通知缓冲区刷新和 FS 更新。它是什么?如果我知道的话,我会说每秒发出该命令来获取事件(如果有),将跟踪文件位置并能够获取附加内容。

或者,也许有更简单的方法?这里的要点是我只部分知道文件的位置和名称,因此必须监视特定目录及其子目录。每秒列出所有这些都是一项开销。

更新:Powershells 的

Get-Content -wait <file>
提供帮助,显示文件的更新,以及触发文件系统观察程序的事件。

更新:看来我能做的就是监视文件创建,然后将其作为流打开并从那里读取将达到所需的结果。虽然需要跟踪这些流,但仍然不清楚如何捕获/识别文件关闭事件来处理流。

c# windows caching filesystemwatcher
1个回答
0
投票

记事本的作用是打开文件并将其映射为内存映射部分。内存映射部分由内存管理来管理,其机制与缓存有关。可能是文件映射或记事本执行某些操作后开始刷新缓存。

如何跟踪更改 - 使用 FileSystemWatcher,预期的情况是捕获文件列表一次,如果检测到更改,则重新扫描更改的目录。效率不太高。另一种方法是使用文件系统过滤器驱动程序来检测文件更改。过滤器驱动程序提供了充足的功能和灵活性,并且它始终为您提供已更改文件的确切名称,甚至是正在写入的数据(当您跟踪文件写入操作时)。过滤器驱动程序的缺点是需要将其安装到系统中,这需要管理员或同等权限。从头开始创建是极其困难的。

在我们的 CBFS Filter 产品中,我们创建了一个示例类来重现 FileSystemWatcher,但使用我们的文件系统过滤器驱动程序。有一篇文章描述了该示例的所有内部结构here

看来我能做的就是监视文件创建,然后将其作为流打开并从那里读取将达到所需的结果。

这很大程度上取决于应用程序如何写入数据。如果您关心将数据直接写入您了解的文件的特定应用程序,则没有问题。但许多应用程序首先将数据写入临时文件,然后将临时文件重命名为持久名称。在这种情况下,您可以跟踪对临时文件的写入或跟踪将文件重命名为您感兴趣的永久名称。

此外,应用程序可以以独占方式打开文件进行写入,在文件关闭之前不允许打开该文件。过滤器驱动程序可以绕过这些限制。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.