多FileSystemWatcher的一个好主意?

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

我正在写一个小编辑器组件很像记事本++或UltraEdit中需要监视用户打开的文件 - 它有点粘糊糊的,但多数民众赞成它需要的方式。

它是明智的使用FileSystemWatcher对象的多个实例来监测打开文件 - 再次如记事本++或用UltraEdit或是否有更好的方式来管理这些?

一旦该文件已被关闭,他们会妥善处理。

对不起,另一件事,那会是明智的创建驱动器的通用FileSystemWatcher对象和监控,那么只能说明他们的消息重新加载该文件,一旦我知道它的正确的文件?或者是,retarted?

c# winforms file io filesystemwatcher
4个回答
3
投票

你不会碰到有多个FileSystemWatchers的问题,实在是没有任何其他的方式来退出这个功能。

出于性能考虑,只是一定要指定为窄的过滤器,你可以逃脱。


2
投票

FileSystemWatcher的有一个缺点,它锁定监视文件夹,因此,举例来说,如果你正在看移动存储文件,它防止“安全删除设备”。

您可以尝试通过使用SHChangeNotifyRegister壳牌通知。在这种情况下,你将有所有的变化(或几个,如果你愿意的话)一个入口点,但在这种情况下,你会需要一些本地shell的互操作。


0
投票

这取决于可能的用例。

如果用户要在同一个目录中打开多个文件,可能不会修改任何其他为目录中的一个观看者可能不太繁重不是每一个文件,如果文件的数量是很大的。

你会发现的唯一方法是通过标杆。当然,在做每一个文件,使观察者更简单的寿命,这样应该是你的第一种方法。注意观察火上的系统线程池的事件,所以多个观察者可以在同一时间火(的东西,可能会影响你设计)

我肯定不会做的每个驱动器一个观察者,你会引起更努力,这样即使有积极的过滤。


0
投票

使用多个观察者是好的,如果你要。正如评论ShuggyCoUk说,你可以通过将文件观察家优化成一个,如果所有的文件都在同一个文件夹中。

这也可能是不明智的创建高得多的文件夹中的文件观察器(例如驱动器的根目录),因为现在你的代码必须处理更多的事件从其他变化在文件系统中发生的射击,这是很容易进入缓冲区溢出如果你的代码是不是足够快的速度处理事件。

少文件观察者另一种说法,一个FileSystemWatcher的是原生对象,并将其销存储器。所以,这取决于寿命和你的应用程序的大小,你可能会陷入内存碎片问题的方法如下:

你的代码运行很长一段时间(例如数小时或数天)每当你打开一个文件时,它在内存中创建的一些数据块和实例文件观察者。然后,您可以清除此临时数据,但该文件观察者仍然存在,如果你重复多次(而不是关闭文件,或忘记处置观察家)刚刚创建的虚拟内存多个对象不能被CLR移动,并有可能进入内存拥堵。请注意,这不是一个大问题,如果你周围有一些观察家,但是如果你怀疑你可能进入数百个或更多,提防那将成为一个大问题。

© www.soinside.com 2019 - 2024. All rights reserved.