背景FileSystemWatcher的報告可用的文件網絡共享,但文件無法找到
我有了一個共享文件夾\\Server\Share
有4子文件夾的服務器:
- OutboundFinal
- OutboundStaging
- InboundFinal
- InboundStaging
所有文件夾駐留在同一個物理磁盤和分區上,不使用連接點。
我也有幾個WinForms客戶端(最多10個)寫和讀文件到這個共享中,每個客戶端在多線程(最多5個)上工作。客戶端文件(最多50個線程)被登錄到\\Server\Share\OutboundStaging
文件夾中。每個文件都有一個GUID的名稱,所以不會覆蓋。文件完成寫入後,客戶端將其移至\\Server\Share\OutboundFinal
文件夾。在同一臺服務器上運行的Windows服務會將其選中,刪除,處理,然後將具有相同名稱的文件寫入\\Server\Share\InboundStaging
文件夾。文件完成寫入後,它將被服務移動到\\Server\Share\InboundFinal
文件夾。
這\\服務器\共享\文件夾InboundFinal通過使用FileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
的FileSystemWatcher.Filter
每個客戶的WinForms每個線程監視設置爲某線程預計在\服務器\共享查看該文件的文件名GUID \ InboundFinal文件夾,因此FileSystemWatcher會一直等到文件夾中顯示特定文件。
我已經閱讀了關於FileSystemWatcher
的幾個SO問題,表現不正常並且未報告UNC股份的變化。然而,這不是我的情況。
我使用的代碼如下所示:
FileSystemWatcher fileWatcher = new FileSystemWatcher();
fileWatcher.Path = InboundFinalFolder;
fileWatcher.Filter = GUIDFileName; // contains full UNC path AND the file name
fileWatcher.EnableRaisingEvents = true;
fileWatcher.IncludeSubdirectories = false;
var res = fileWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
if (!fileWatcher.TimedOut)
{
using (FileStream stream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) {
byte[] res = new byte[stream.Length];
stream.Read(res, 0, stream.Length);
return res;
}
這是使用行拋出異常。
的問題
我將認爲fileWatcher.WaitForChanged將繼續只要用正確的GUID名的文件在\\Server\Share\InboundFinal
文件夾中。這正是FileSystemWatcher在本地文件夾上的工作方式,而不是通過網絡訪問的文件共享(本地文件,甚至通過共享訪問,也傾向於工作)。 FileSystemWatcher報告線程正在等待的文件位於FileSystemWatcher \\Server\Share\InboundFinal
文件夾中。但是,當我嘗試讀取文件時,出現FileNotFoundException。讀取線程必須等待3-15秒才能讀取文件。我嘗試用FileStream與Read
共享打開文件。
什麼可能導致此行爲?我如何解決它?理想情況下,FileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
應該只能繼續執行,如果文件可以被讀取或超時發生。
FileNotFoundException是非常基本的。一個標準的錯誤是使用GUIDFileName打開文件。不夠好,這不是一個完整的路徑。測試時意外工作,從不在服務器上工作。也可以嘗試禁用反惡意軟件,以防萬一它認爲在掃描時隱藏文件是個好主意。你沒有發佈實際失敗的代碼,所以這些只是猜測。 –
GUIDFileName屬性包含完整的UNC路徑和GUID文件名。對不起,我編輯了我的問題中的代碼片段來澄清。 – Daniel
這是**使用**行引發異常。 – Daniel