2

当我尝试监视网络路径上的文件夹时出现异常 System.IO.Internal.BufferOverflowException (DFS - 分布式文件系统): To many changes at once 。当 FileSystemWatcher 正在监视不使用此文件系统的本地/网络路径时,它可以正常工作。

我能够从本地路径上的 1000 + 个文件中获取事件并且我没有收到 BufferOverflow 异常,但是当我将文件复制到 DFS 上的文件夹时,我什至无法从一个文件夹中获取事件(澄清这一点,我收到了一个错误事件......)。

我已经尝试设置:

fileSystemWatcher.InternalBufferSize = 65536;

我不确定这是否会对您有所帮助,但路径如下所示:

\\corpnet\cloud\\Network\testFolder\myFolderToMonitor

编辑:1我不确定为什么路径中有两个双斜杠。我可以监控没有问题的文件夹,直到\corpnet\cloud路径。一旦我尝试监视从以下位置开始的任何文件夹,我就会遇到错误

...\\Network\...

您的任何提示表示赞赏。

谢谢

4

2 回答 2

8

当然,一次更改太多,这是一个消防问题。您已经将缓冲区大小增加到允许的最大值,Windows 不允许更大的。它被分配在“宝贵的”内存中,即内核内存池中。

可能是一个高度活跃的文件服务器,但更常见的是,这是由代码中的问题引起的。你从消防水管里喝水的速度不够快。您的事件处理程序必须尽快返回,以便足够快地清空缓冲区并跟上文件服务器上的更改速度。

这经常会出错,典型的实现会做一些不明智的事情,比如复制文件、读取文件、循环直到文件可以打开。昂贵的东西,循环错误是一个非常常见的错误,当事件触发时文件很少可用,因为任何更改文件的应用程序仍然打开它。对文件保持锁定的时间也没有上限。显然,这总是会导致缓冲区溢出。

因此,一个正确实现的 FileSystemWatcher 事件处理程序除了快速将传递的文件路径放入线程安全队列之外什么都不做,并且什么也不做,这永远不会超过一微秒。并使用另一个线程尝试再次清空该队列,处理文件无法打开的可能性。

于 2014-03-01T16:25:07.307 回答
1

我遇到了同样的问题。观看本地文件夹并放入 5 个新文件没有问题。但是当我查看网络文件夹时,我收到错误“目录中一次更改太多”。只有5个文件。

你已经找到解决办法了吗?

我无法真正调整代码,所以我的临时解决方法是将文件放在临时文件夹中并轮询该文件夹。当有新文件时,我会以 500 毫秒的延迟单独移动它们

于 2017-06-01T11:33:49.750 回答