多个FileSystemWatcher来监控本地系统上的文件?

时间:2010-05-29 06:56:35

标签: c# windows winforms system filesystemwatcher

我们正在为我们的内部会计软件包系统编写一个类似工具的文本编辑器,该系统具有可以通过我们自己的Xml语言规范完成的操作。这些宏命令在Xml文件中指定,我们需要能够监视打开的文件是否在外部修改了bean。

唯一的问题是,任何时候都可能有20-30个文件打开了不同的路径。在这种情况下使用多个FileSystemWatchers会不会很好?或者更好的方法是监视根驱动器并捕获与编辑器中的打开文件匹配的特定事件(尽管可能会引发大量事件)。

有些是本地驱动器(C,D,E),其他驱动器是其网络驱动器(U,X,G,H)。文件非常粗,大约300-400Kb。

2 个答案:

答案 0 :(得分:1)

首先是一些事实

1- FileSystemWatcher是ReadDirectoryChanges的包装器 2- ReadDirectoryChanges创建一个内核缓冲区来缓存来自非分页池内存的事件,以便每次调用ReadDirectoryChanges

上述第2点的含义是FileSystemWatcher的每个实例都将从非分页池中分配内存。请记住,这是用于内核模式驱动程序等的内存,虽然它可以动态扩展,但它很难“限制”在启动时根据系统资源计算的最大大小(机器有多少内存) )。

因此,鉴于以上情况,我会考虑以下内容。

如果您希望看到的更改量。如果这个值很低,请选择具有最小缓冲区大小的多个观察者。

另外请记住,如果您决定使用大缓冲区,监控网络驱动器不支持超过64K的缓冲区大小,大于此值,您将无法获得事件。

答案 1 :(得分:0)

我认为你几乎肯定需要多个观察者。 FileSystemWatcher的缓冲区可能会溢出,否则您可能会错过事件,您可以更改缓冲区大小(使用InternalBufferSize),但最多只能更改64 KB。

但是,请注意FileSystemWatcher使用FindFirstChangeNotification这对于网络驱动器来说并不完全可靠(特别是在负载很重的情况下,但也可能在其他情况下),所以你必须期望并计划你赢了不接收来自网络的每一个事件,我的理解是,如果你有多个观察者,可靠性会变得更糟。

总而言之,我认为你必须增加缓冲区,尽可能地过滤,然后尽可能少地使用观察者而不会溢出缓冲区,因此可能需要进行一些试验和错误。做对了。