3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
盡管這個(gè)答案包含一些有用的信息,但事實(shí)上它的工作原理是不正確的Directory.Delete
。請(qǐng)閱讀此答案的評(píng)論以及此問(wèn)題的其他答案。
我之前遇到過(guò)這個(gè)問(wèn)題。
問(wèn)題的根源是此函數(shù)不會(huì)刪除目錄結(jié)構(gòu)中的文件。因此,您需要做的是創(chuàng)建一個(gè)函數(shù),在刪除目錄本身之前刪除目錄結(jié)構(gòu)中的所有文件,然后刪除所有目錄。我知道這與第二個(gè)參數(shù)相反,但它是一種更安全的方法。此外,您可能希望在刪除文件之前從文件中刪除READ-ONLY訪問(wèn)屬性。否則會(huì)引發(fā)異常。
只需將此代碼打入您的項(xiàng)目即可。
public static void DeleteDirectory(string target_dir){ string[] files = Directory.GetFiles(target_dir); string[] dirs = Directory.GetDirectories(target_dir); foreach (string file in files) { File.SetAttributes(file, FileAttributes.Normal); File.Delete(file); } foreach (string dir in dirs) { DeleteDirectory(dir); } Directory.Delete(target_dir, false);}
另外,對(duì)我來(lái)說(shuō),我個(gè)人加上被允許的,因?yàn)槟阆M腥撕粲踉摴δ軐⒈粍h除的機(jī)器的區(qū)域的限制C:\WINDOWS (%WinDir%)
或C:\
。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果你試圖以遞歸方式刪除目錄a
并且a\b
在資源管理器中打開(kāi)目錄,b
則會(huì)被刪除但是你會(huì)得到錯(cuò)誤“目錄不為空”,a
即使你去看看時(shí)它是空的。任何應(yīng)用程序的當(dāng)前目錄(包括Explorer)都保留目錄的句柄。當(dāng)你打電話時(shí)Directory.Delete(true)
,它從下往上刪除:b
然后a
。如果b
在資源管理器中打開(kāi),資源管理器將檢測(cè)到刪除b
,向上更改目錄cd ..
并清理打開(kāi)的句柄。由于文件系統(tǒng)異步Directory.Delete
操作,操作因與Explorer沖突而失敗。
不完整的解決方案
我最初發(fā)布了以下解決方案,其中包含中斷當(dāng)前線程以允許Explorer時(shí)間釋放目錄句柄的想法。
// incomplete!try{ Directory.Delete(path, true);}catch (IOException){ Thread.Sleep(0); Directory.Delete(path, true);}
但這僅在打開(kāi)目錄是要?jiǎng)h除的目錄的直接子目錄時(shí)才有效。如果a\b\c\d
在資源管理器中打開(kāi)并且您使用此功能a
,則刪除d
和后此技術(shù)將失敗c
。
一個(gè)更好的解決方案
即使在資源管理器中打開(kāi)了其中一個(gè)較低級(jí)別的目錄,此方法也將處理深層目錄結(jié)構(gòu)的刪除。
/// <summary>/// Depth-first recursive delete, with handling for descendant /// directories open in Windows Explorer./// </summary>public static void DeleteDirectory(string path){ foreach (string directory in Directory.GetDirectories(path)) { DeleteDirectory(directory); } try { Directory.Delete(path, true); } catch (IOException) { Directory.Delete(path, true); } catch (UnauthorizedAccessException) { Directory.Delete(path, true); }}
盡管我們自己進(jìn)行了額外的遞歸工作,但我們仍然需要處理UnauthorizedAccessException
可能發(fā)生的事情。目前尚不清楚第一次刪除嘗試是否為第二次成功刪除嘗試鋪平了道路,或者它是否僅僅是拋出/捕獲允許文件系統(tǒng)趕上的異常所引入的時(shí)間延遲。
您可以通過(guò)Thread.Sleep(0)
在try
塊的開(kāi)頭添加a來(lái)減少在典型條件下拋出和捕獲的異常數(shù)。此外,存在一種風(fēng)險(xiǎn),即在系統(tǒng)負(fù)載較重的情況下,您可以通過(guò)兩次Directory.Delete
嘗試并且失敗。將此解決方案視為更強(qiáng)大的遞歸刪除的起點(diǎn)。
一般答案
此解決方案僅解決與Windows資源管理器交互的特性。如果你想要一個(gè)堅(jiān)如磐石的刪除操作,要記住的一點(diǎn)是,任何東西(病毒掃描程序,無(wú)論什么)都可以隨時(shí)打開(kāi)你想要?jiǎng)h除的內(nèi)容。所以你必須稍后再試。多久以后,您嘗試多少次,取決于刪除對(duì)象的重要性。正如MSDN所示,
強(qiáng)大的文件迭代代碼必須考慮到文件系統(tǒng)的許多復(fù)雜性。
這個(gè)無(wú)辜的聲明,只提供了NTFS參考文檔的鏈接,應(yīng)該讓你的頭發(fā)站起來(lái)。
- 3 回答
- 0 關(guān)注
- 3257 瀏覽
添加回答
舉報(bào)