当前位置:  开发笔记 > 编程语言 > 正文

FileSystemWatcher vs polling监视文件更改

如何解决《FileSystemWatchervspolling监视文件更改》经验,为你挑选了8个好方法。

我需要设置一个应用程序来监视在本地或网络驱动器上的目录中创建的文件.

请问FileSystemWatcher一个计时器或投票将是最好的选择.我过去曾使用过这两种方法,但并不广泛.

两种方法都存在哪些问题(性能,可靠性等)?



1> Jason Jackso..:

我看到文件系统观察器在生产和测试环境中失败了.我现在认为它很方便,但我认为它不可靠.我的模式是使用文件系统观察程序来监视更改,但偶尔进行轮询以捕获丢失的文件更改.

编辑:如果您有用户界面,您还可以让用户"刷新"更改而不是轮询.我会将它与文件系统观察器结合起来.


我也看到过是否会跌倒.我们使用的解决方案是包装我们自己的类,其中包装类ALSO使用计时器来检查观察者是否仍在进行.
仅仅陈述"我有一天见过鬼"并不具有建设性和专业性.似乎人们在线程中提到有关非页面超出缓冲区溢出的msdn文档可以解释你的问题.你尝试过使用布伦特的方法吗?
我相信我们在XP和Server 2003上在本地目录和文件共享上测试了它,并且在现场有XP机器.我们在本地目录和文件共享方面都遇到了问题.我们提出的可能原因之一是在目录中在很短的时间内复制/创建了大量文件.
我刚刚在亚马逊上购买了一个气体传感器,当他们明显没有正确校准或什至不知道校准的时候,有很多人说它无法正常工作令我感到惊讶... FileSystemWatcher知道限制来自高流量它的缓冲区大小。几乎可以保证,这就是它“失败”的原因。这在文档中很容易解释,并且有一些解决方法可以提供非常可靠的操作(如下所述)。这不是一个好答案,只是说“ errr,某次没有工作,不知道为什么...没人应该依靠它”。

2> 小智..:

我遇到的最大问题是当缓冲区满了时丢失文件.很容易修复 - 只需增加缓冲区.请记住,它包含文件名和事件,因此请将其增加到预期的文件数量(试用和错误).它确实使用了无法分页的内存,因此如果内存不足,它可能会强制其他进程进行分页.

这是关于缓冲区的MSDN文章: FileSystemWatcher .. ::.InternalBufferSize属性

每个MSDN:

增加缓冲区大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区.要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性过滤掉不需要的更改通知.

我们使用16MB,因为一次预计会有大量批次.工作正常,永远不会错过文件.

我们还在开始处理之前读取所有文件,即使只有一个文件...将文件名安全地缓存(在我们的例子中,放入数据库表中)然后处理它们.

对于文件锁定问题,我产生了一个进程,它等待文件解锁等待一秒钟,然后是两秒钟,然后是四个等等.我们从不投票.这已经生产了大约两年没有错误.


缓冲区溢出?哦,你的意思是堆栈溢出.
如果FileSystemWatcher的最大内部缓冲区是64KB,你如何使用16MB?

3> Brent Rockwo..:

FileSystemWatcher也可能错过在繁忙时间的变化,如果排队改变的次数溢出提供的缓冲液中.这不是.NET类本身的限制,而是基础Win32基础结构的限制.根据我们的经验,最小化此问题的最佳方法是尽快将通知出列并在另一个线程上处理它们.

如上面的@ChillTemp所述,观察者可能无法处理非Windows共享.例如,它在安装的Novell驱动器上根本不起作用.

我同意一个很好的折衷方案是偶尔进行民意调查,以便找出任何错过的变化.


文件系统观察者可以开始快速连续发起大量事件.如果你至少不能像被触发一样快地执行你的事件处理程序,那么最终处理程序将开始在场上放弃事件而你会错过任何事情.

4> chilltemp..:

另请注意,文件系统观察程序在文件共享上不可靠.特别是如果文件共享托管在非Windows服务器上.FSW不应用于任何关键的事情.或者应该与偶尔的民意调查一起使用,以验证它没有遗漏任何东西.


Microsoft是否承认在非Windows文件共享上不可靠?自从从Windows共享切换到基于Linux的SMB共享以来,我们当然正在体验这一点.

5> Jim..:

就个人而言,我已经FileSystemWatcher在生产系统上使用了它,它运行良好.在过去的6个月中,它没有一次性打嗝全天候运行.它正在监视单个本地文件夹(共享).我们必须处理相对较少的文件操作(每天触发10个事件).这不是我曾经不必担心的事情.如果我不得不重新制定决定,我会再次使用它.



6> PersistenceO..:

我目前使用的FileSystemWatcher是一个平均每100毫秒更新一次的XML文件.

我发现,只要FileSystemWatcher配置正确,您就不应该遇到本地文件问题.

我没有远程文件监视和非Windows共享的经验.

我会考虑轮询文件是多余的,不值得花费开销,除非你天生不信任FileSystemWatcher或直接遇到其他人在这里列出的限制(非Windows共享和远程文件监视).



7> Jon Norton..:

我在使用FileSystemWatcher网络共享时遇到了麻烦.如果你在纯Windows环境中,它可能不是问题,但我正在观看NFS共享,因为NFS是无状态的,所以当我正在观看的文件发生变化时,从来没有通知.



8> 小智..:

我会去投票.

网络问题导致FileSystemWatcher不可靠(即使在重载错误事件时).

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有