Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileSystemWatcher内部缓冲区溢出_C#_Windows Server 2008_Filesystemwatcher_Buffer Overflow_Microsoft Distributed File System - Fatal编程技术网

C# FileSystemWatcher内部缓冲区溢出

C# FileSystemWatcher内部缓冲区溢出,c#,windows-server-2008,filesystemwatcher,buffer-overflow,microsoft-distributed-file-system,C#,Windows Server 2008,Filesystemwatcher,Buffer Overflow,Microsoft Distributed File System,当我试图监视网络路径(DFS-分布式文件系统)上的文件夹时,我得到一个异常System.IO.Internal.BufferOverflowException:一次执行多个更改。当FileSystemWatcher监视不使用此文件系统的本地/网络路径时,它可以正常工作 我能够从本地路径上的1000多个文件中获取事件,并且没有收到BufferOverflow异常,但是,当我将文件复制到DFS上的文件夹时,我甚至无法从其中获取事件(为了澄清这一点,我收到了一个引发的错误事件…) 我已经尝试设置: f

当我试图监视网络路径(DFS-分布式文件系统)上的文件夹时,我得到一个异常System.IO.Internal.BufferOverflowException:一次执行多个更改。当FileSystemWatcher监视不使用此文件系统的本地/网络路径时,它可以正常工作

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

我已经尝试设置:

fileSystemWatcher.InternalBufferSize = 65536;
我不确定这是否对您有帮助,但路径如下所示:

\\corpnet\cloud\\Network\testFolder\myFolderToMonitor
编辑:1 我不知道为什么路径中有两条双斜线。我可以监控没有问题的文件夹,直到\corpnet\cloud路径。一旦我试图监视从开始的任何文件夹,就会出现错误

...\\Network\...
感谢您的任何提示


谢谢

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

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

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


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

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

你已经找到解决办法了


我不能真正地调整代码,所以我的临时修复方法是将文件放在临时文件夹中并轮询该文件夹。当有新文件时,我会以500毫秒的延迟分别移动它们

谢谢Hans的回答。我真的很感激你为帮助我所做的努力。这可能是一个高度活跃的文件服务器,因为它是一个数据中心。关于我的代码中的问题,我不确定这是否是一个问题,因为我甚至没有进入循环/复制文件部分。一旦文件被复制到目录中,我就会收到一个错误事件。出于测试目的,我的文件创建事件是一个空事件,因此在我看来,这不是一件昂贵的事情。我仍然认为这必须与网络路径/文件系统/DFS或类似的东西有关。还有一件事,您认为这可能与从数据中心到我们网络中受监控的共享文件夹的访问时间延迟超过500ms-1000ms+有关吗?