2010-02-08 140 views
8

我試圖創建一個遠程目錄,然後向它寫入一個文件。每過一段時間,應用程序都會在嘗試寫入文件時失敗,並顯示System.IO.DirectoryNotFoundException。Directory.CreateDirectory延遲問題?

當我編寫文件時,我使用返回的DirectoryInfo對象來幫助創建文件路徑,因此應用程序似乎認爲該目錄已創建。但是,該目錄不存在。

在Windows完成創建之前,是否有機會嘗試寫入目錄?我認爲Directory.CreateDirectory在這個任務完成之前不會返回。

+0

我沒有一個很好的答案,但是你沒有明確地說「remote」是什麼。因此,也許這是遠程服務器在本地文件系統上創建了文件夾但瀏覽時尚未返回的情況。也許是一個緩存問題(是否有什麼實際緩存文件系統結構?)。 – 2010-02-08 23:15:06

+0

遠程服務器是Windows服務器還是運行Samba或類似服務器的不同類型的服務器? – Jacob 2010-02-08 23:23:14

+0

這是AS400上的IFS份額。該應用程序在Windows機器上運行,使用UNC路徑訪問IFS共享。 – majorpayne27 2010-02-08 23:37:48

回答

7

答案 - 是的。預計文件/目錄創建滯後時的行爲。正如其他評論者所提出的普通解決方案是在一些超時時間內使用重試。無論使用什麼文件功能,其行爲都是一樣的:Findfirst,CreateFile,WaitForSingleObject等。

另一種解決方案是使用在Vista和更高版本的Windows操作系統上發現的API的新事務功能。

這個問題令人討厭,而且從未被其他平臺上的文件密集型項目開發人員所理解,並轉移到了Windows上:像DOS/CMD腳本,SVN客戶端,Cygwin,perl,各種java應用程序,各種安裝程序等。

+1

+1我們總是看到這一點,直到我們有一個完整的IO調用庫調整到我們的NAS設置。 – 2010-02-08 23:44:03

+0

有誰知道那些其他神奇的方法是什麼? – Mrchief 2016-03-02 22:38:49

4

雖然我從來沒有經歷過這種行爲,也無法解釋它,但實用的解決方案是圍繞訪問目錄的呼叫建立一個循環。在該循環內捕獲DirectoryNotFoundException,並在每次短暫暫停後重試訪問幾次。如果超過重試次數,則重新處理異常。

此時添加詳細記錄可能會幫助您確定問題的實際原因。

+0

檢查'Directory.Exists()'可能會更有效,而不是捕獲異常,除非該函數錯誤地返回true,並且訪問它會拋出異常。 – 2010-02-08 23:39:09

+0

@CoryCharlton:這是如何更有效率?檢查文件系統比拋出和檢查異常差一個數量級,並且可以假定文件系統在這種情況下也會執行Directory.Exists()。 – Arafangion 2012-01-06 09:53:56

6

我只是有這個問題,我的情況是這樣的:

if(!exportDirectory.Exists) 
    exportDirectory.Create(); 

再後來當有傳遞給它這個相同 DirectoryInfo對象另一個類我做:

if (!exportDirectory.Exists) 
    throw new DirectoryNotFoundException(exportDirectory.FullName); 

而目錄顯然仍然不存在(雖然我有父窗口在Windows中打開,當然我可以看到它在我面前)。

我找到的解決方案是創建初期我應該調用目錄後:

exportDirectory.Refresh(); 

從微軟:

刷新對象的狀態。 (繼承自FileSystemInfo。)