2014-04-15 94 views
1

我得到一個非常間歇性的「目錄不空」錯誤試圖從c#代碼中刪除目錄,但是當我看,目錄似乎是空的。錯誤「目錄不爲空。」當目錄是empy

實際情況是這樣的:進程A使用同步.Net遠程調用調用進程B,進程B從目錄中刪除文件,然後返回到進程A刪除目錄本身。該磁盤是本地連接的NTFS磁盤(可能是SATA)。

我想知道是否有可能的競爭條件與NTFS,當你有兩個進程合作在這種方式,其中進程B的刪除調用沒有完全刷新到文件系統?

當然,更明顯的答案是當前目錄真的不是空的,而其他東西在我看它之前就清空了,但我沒有看到在當前應用程序中會發生這種情況,因爲沒有其他的過程會刪除文件。

+0

您是否嘗試過使用'Directory.Delete(target_dir,true);'來遞歸移除目錄和所有文件? – chridam

+0

你有沒有試過用刪除鍵刪除它? –

+0

@Weyland,對不起,我應該明確說明,是的,我買它的時間,刪除它沒有問題 – Andy

回答

4

當然,刪除目錄在多任務操作系統上是一個危險的冒險。您總是有另一個進程打開文件的風險。如果不刪除該目錄在你的方案有兩個主要的原因:

  • 特別麻煩,有些是打開的文件,它不會阻止你刪除文件的方式,但仍是一種過程,使刪除目錄失敗並出現此錯誤。搜索索引器和反惡意軟件適合這個類別。他們將使用.NET程序中的刪除共享FileShare.Delete打開文件。刪除文件工作正常。但是文件在關閉文件句柄之前不會消失。所以你不能刪除目錄,直到他們這樣做。

  • 很難診斷的是一個進程將目錄選作當前工作目錄。 Environment.CurrentDirectory在.NET程序中。資源管理器往往會觸發這一點,只要查看目錄就足以防止它被刪除。

這些事故完全發生在您的控制之外。你需要處理它們,捕捉異常是必需的。稍後您可以再試一次,但是您不得不等待多長時間才能達到上限。重命名目錄並給它一個「垃圾」名稱是一個好策略。注意Windows中的回收站基本上遵循這種情況,不僅僅是回收利用:)

+0

謝謝,我將調查這樣的想法,即搜索索引器或可能的備份程序已經設法鎖定文件。我得到的錯誤並不是目錄被鎖定(如果一個進程將它設置爲CWD),但我可以肯定地看到,可能存在某種訪問模式會導致我的症狀。我們已經發現了異常,並且我們仍然使用垃圾名稱(這只是一個臨時文件),所以它不會給我們帶來很大的麻煩,只是有興趣嘗試去找到它的底部。 – Andy