Jes*_*mos 13 c# filesystemwatcher windows-7
我正在编写一个监视网络目录并且正在运行Windows Server 2008计算机的工具,FileSystemWatcher的OnChanged事件正在被任何未使用Windows 7的计算机放置在网络驱动器上的文件中正确触发因为如果在Windows 7计算机上复制的文件数量超过19(同时),那么如果文件单独完成,则不会触发任何事件.是否有解决方法或者是Windows 7内核如何处理FSW事件?
只是为了澄清它从XP机器复制时适用于数千个文件.(该软件仍在2008服务器机器上).
Dir*_*mar 22
来自MSDN:
Windows操作系统会在FileSystemWatcher创建的缓冲区中通知组件文件更改.如果在短时间内有许多变化,缓冲区可能会溢出.这会导致组件无法跟踪目录中的更改,并且只会提供一揽子通知.使用InternalBufferSize属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区尽小但足够大,以免错过任何文件更改事件.要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性,以便过滤掉不需要的更改通知.
如果增加缓冲区大小是不够的,并且您无法控制一次触发事件的文件数,则必须添加其他轮询.
另见相关问题:
更新:
简单地增加缓冲区大小可能很诱人,但这应该谨慎进行.实际上,在网络访问方面存在64k的限制.该FileSystemWatcher班是使用Windows API函数ReadDirectoryChangesW在其下方有此限制:
当缓冲区长度大于64 KB且应用程序正在通过网络监视目录时,ReadDirectoryChangesW失败并返回ERROR_INVALID_PARAMETER.这是由于基础文件共享协议的数据包大小限制.
如果你想更深入地了解修改缓冲区大小的成本,你应该看一下微软的Walter Wang的帖子:
整个网络中的FileSystemWatcher(完整帖子引用如下)
对不起,FileSystemWatcher.InternalBufferSize的文档在监视网络路径时没有说清楚缓冲区大小.监控网络路径时,建议不要超过64K.
FileSystemWatcher基本上是Win32 ReadDirectoryChangesW API的.Net包装器.要使用ReadDirectoryChangesW,您可以创建并指定操作系统将使用更改填充的缓冲区.但是,ReadDirectoryChangesW文档中未提及的内容(但在FileSystemWatcher文档中暗示)是文件系统创建内部内核缓冲区以临时存储更改信息,直到它有机会更新用户缓冲区.创建的内核缓冲区的大小与ReadDirectoryChangesW中指定的大小相同,并在非分页池内存中创建.每次创建/调用FileSystemWatcher/ReadDirectoryChangesW时,也会创建新的内核缓冲区.
内核内存池(分页和非分页)在系统地址空间中留出,供设备驱动程序和其他内核组件使用.它们会根据需要动态增长和缩小.通过转到任务管理器的"性能"选项卡,可以轻松查看池的当前大小.这些池将动态增长,直到它们达到在引导时计算的最大值,并取决于可用的系统资源(主要是RAM).您不希望达到此最大值,否则各种系统服务和驱动程序将开始失败.但是,这个计算出的最大值不容易获得.要确定最大池大小,您需要使用内核调试器.如果您对有关系统内存池的更多信息感兴趣,
考虑到这一点,没有建议你可以使用什么尺寸的缓冲区.系统池的当前和最大大小将随客户端而变化.但是,对于每个FileSystemWatcher/ReadDirectoryChangesW缓冲区,您可能不应该超过64k.这源于ReadDirectoryChangesW中记录的网络访问存在64k限制的事实.但最终您将不得不在各种预期的目标系统上测试应用程序,以便您可以调整缓冲区.
与.Net应用程序相关的开销,我认为Win32 ReadDirectoryChangesW程序可能能够以相同的缓冲区大小实现更好的性能.但是,由于文件更改速度非常快,缓冲区溢出将不可避免,开发人员将不得不处理发生溢出的情况,例如手动枚举目录以检测更改.
总之,FileSystemWatcher和ReadDirectoryChangesW是一种轻量级文件更改检测机制,它将具有其局限性.更改期刊是另一种我们认为是中等重量解决方案的机制,但仍有局限性:
http://msdn.microsoft.com/en-us/library/aa363798%28VS.85%29.aspx
重量级的解决方案是编写一个专用的文件系统过滤器驱动程序,它位于文件系统堆栈中并监视文件系统的变化.当然,这将是最复杂的方法.大多数病毒扫描程序,备份软件和文件系统监视实用程序(如filemon(www.sysinternals.com))都实现了筛选器驱动程序.
我希望上面的解释可以帮助您了解您遇到的问题的根本原因.请回复告诉我们您是否需要进一步的信息.谢谢.