2

當我嘗試監視網絡路徑(DFS - 分佈式文件系統)上的文件夾時,出現異常System.IO.Internal.BufferOverflowException:一次進行多項更改。當FileSystemWatcher監視不使用此文件系統的本地/網絡路徑時,它工作正常。FileSystemWatcher InternalBufferOverflow

我能夠從本地路徑上的1000+文件中獲得一個事件,但我沒有收到BufferOverflow異常,但是當我將文件複製到DFS上的文件夾時,我甚至無法從一個事件中獲取事件爲了澄清這一點,我得到了一個錯誤事件引發...)。

我已經嘗試設置:

fileSystemWatcher.InternalBufferSize = 65536; 

我不知道這是否會幫助你,但路徑是這樣的:

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

編輯:1 我不知道爲什麼路徑中有兩個雙斜槓?我可以監視沒有問題的文件夾,直到路徑爲\ corpnet \ cloud。一旦我試圖監視任何從

...\\Network\... 

的任何提示,我就會收到錯誤。

感謝

回答

5

當然,一下子太多的變化,這是一個流水問題。您已經將緩衝區大小增加到允許的最大值,Windows不允許更大的緩衝區大小。它被分配在「珍貴」的內存中,即內核內存池。

可能是一個高度活躍的文件服務器,但更常見的是這是由您的代碼中的問題引起的。你不能夠快速飲用水龍頭。您的事件處理程序必須儘快返回,以便緩衝區清空得足夠快,並能跟上文件服務器上更改的速度。

這經常被人摸不着頭腦,一個典型的實現會做一些不明智的事情,比如複製文件,讀取文件,循環直到文件被打開。昂貴的東西,循環錯誤是一個非常常見的錯誤,當事件觸發時,文件很少可用,因爲無論改變文件的應用程序是否仍然打開文件。關於可以鎖定文件的時間長度沒有限制。很明顯,這將永遠導致緩衝區溢出。

因此,一個正確實施的FileSystemWatcher事件處理程序只會將傳遞的文件路徑快速放入一個線程安全的隊列中,並且不會做任何其他事情,這絕不會超過1微秒。並使用另一個線程嘗試再次清空該隊列,處理文件無法打開的可能性。

+0

謝謝漢斯的回答。我非常感謝您爲幫助我而付出的努力。這肯定是一個非常活躍的文件服務器,因爲它是一個數據中心。關於我的代碼中的問題,我不確定這是否是一個問題,因爲我甚至沒有進入該循環/複製文件部分。只要一個文件被複制到目錄中,我就會收到一個錯誤事件。我的文件創建事件是空的測試目的,所以它不是我認爲的昂貴的東西。我仍然認爲這必須是網絡路徑/文件系統/ DFS或類似的東西。 – wariacik

+0

還有一點,您認爲這可能與我們網絡中從數據中心到受監控共享文件夾的訪問時間延遲超過500ms-1000ms +有關嗎? – wariacik

0

我得到了同樣的問題。觀看本地文件夾並放入5個新文件沒有問題。但是,當我觀看網絡文件夾時,出現錯誤「目錄中的一次更改太多」。它只有5個文件。

您已經找到了解決辦法?

我無法真正調整代碼,因此我的臨時修復方法是將文件放在臨時文件夾中並輪詢該文件夾。當有新文件時,我將它們分別移動500毫秒延遲