【发布时间】:2012-02-08 15:52:12
【问题描述】:
我想编写一个应用程序来获取整个计算机上每个文件更改的事件(以在文件位置/权限和我的应用程序的数据库之间同步)。
我正在考虑使用 .net filewatcher 类,但经过一些测试,我发现了以下限制:
1) filewatcher 有一个缓冲区 (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.90).aspx):
如果短时间内有很多变化,缓冲区可能会溢出。 这会导致组件失去对目录更改的跟踪, 它只会提供一揽子通知。扩大规模 具有 InternalBufferSize 属性的缓冲区很昂贵,因为它 来自无法换出到磁盘的非分页内存,因此 保持缓冲区小但足够大,以免错过任何文件更改 事件。为避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改 通知。
所以在整个计算机中,我可以获得一些需要处理的大量事件(高峰期)。即使在事件处理中我只是将事件信息添加到队列中,我仍然可能会错过事件。
2) Filewatcher 有内存泄漏: http://connect.microsoft.com/VisualStudio/feedback/details/654232/filesystemwatcher-memory-leak 我自己查了一下,确实如此,几天后我的进程内存从 20MB 增长到 250MB
3) 微软说我们应该对特定文件夹使用 filewatcher(我不知道为什么):
使用 FileSystemWatcher 监视指定目录中的更改。
因此,出于这些原因,我需要一个替代解决方案来创建我的应用程序。我知道我可以编写一个驱动程序,但我更喜欢它是一个 .net 解决方案(当然基于 win32 api)。
感谢您的帮助, 暗里
【问题讨论】:
-
为什么不使用FileMon?
-
我想在事件发生时在 C# 中实现我自己的逻辑,据我所知 filemon 是一个独立的软件,对吧?
标签: c# filesystemwatcher