2010-05-29 60 views
2

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

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

一些是本地驱动器(C,D,E),另一些是它们的网络驱动器(U,X,G,H)。文件也相当矮大约300-400Kb。

回答

0

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

但是,要知道,FileSystemWatcher使用FindFirstChangeNotification这是不是网络驱动器完全可靠的(尤其是在重负载下,但可能过于否则),所以你必须想到和规划,你将不会从收到的每个事件网络,我的理解是,如果你有多个观察者,可靠性会变得更糟。

所以总而言之,我认为你必须增加缓冲区,尽可能地过滤掉,然后尽可能少地使用监视器,而不要溢出缓冲区,所以可能需要一些试验和错误为了正确。

+0

感谢您的回复,我只是意识到我还没有登录:(无所谓,我很好奇记事本++如何维护什么文件打开,如果他们被修改或不等等。 – 2010-05-29 08:14:20

1

首先几个事实

1 FileSystemWatcher的是围绕ReadDirectoryChanges包装
2- ReadDirectoryChanges创建籽粒缓冲区缓存来自非分页池内存事件每次调用ReadDirectoryChanges

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

因此,鉴于上述情况,我会考虑以下几点。

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

另外请记住,如果您决定采用较大的缓冲区,监控网络驱动器不支持超过64K的缓冲区大小,大于此值并且您不会收到事件。