第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

無(wú)法使用Directory.Delete刪除目錄(路徑,true)

無(wú)法使用Directory.Delete刪除目錄(路徑,true)

DIEA 2019-07-25 19:47:24
無(wú)法使用Directory.Delete刪除目錄(路徑,true)我正在使用.NET 3.5,嘗試使用以下命令遞歸刪除目錄:Directory.Delete(myPath, true);我的理解是,如果文件正在使用或存在權(quán)限問(wèn)題,這應(yīng)該拋出,否則它應(yīng)該刪除目錄及其所有內(nèi)容。但是,我偶爾會(huì)得到這個(gè):System.IO.IOException: The directory is not empty.     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)     at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)     at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)     ...我對(duì)這種方法有時(shí)會(huì)拋出并不感到驚訝,但是當(dāng)遞歸為真時(shí),我很驚訝地得到這條特殊的信息。(我知道目錄不是空的。)有沒(méi)有理由我看到這個(gè)而不是AccessViolationException?
查看完整描述

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:\。


查看完整回答
反對(duì) 回復(fù) 2019-07-25
?
慕哥6287543

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)。


查看完整回答
反對(duì) 回復(fù) 2019-07-25
  • 3 回答
  • 0 關(guān)注
  • 3257 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)