2011-06-23 165 views
8

我做了一個應用程序,用於在某些目錄中搜索某些文件。當一個目錄不存在時,它會拋出DirectoryNotFoundException。我發現了這個異常,但它沒有DirectoryName屬性,或者像FileNotFoundException(FileName)那樣的屬性。我如何從異常屬性中找到目錄名稱?C#從DirectoryNotFoundException獲取目錄名稱

+0

,如果你得到了DirectoryNotFoundException目錄不存在,你肯定不會,如果找到的目錄名稱目錄不存在。我是否誤解了這個問題? – Caimen

+0

@ Caimen:哪個目錄不存在? – SLaks

+1

你想要找到它的名字嗎? –

回答

5

沒有辦法在本機上做到這一點。

地方添加這個類到您的項目:

public static class DirectoryNotFoundExceptionExtentions 
{ 
    public static string GetPath(this DirectoryNotFoundException dnfe) 
    { 
     System.Text.RegularExpressions.Regex pathMatcher = new System.Text.RegularExpressions.Regex(@"[^']+"); 
     return pathMatcher.Matches(dnfe.Message)[1].Value; 
    } 
} 

捕獲異常,並使用類型擴展名是這樣的:

catch (DirectoryNotFoundException dnfe) 
{ 
    Console.WriteLine(dnfe.GetPath()); 
} 
+0

謝謝它的作品! – Sp3ct3R

+0

在我的情況下,我不得不尋找雙引號:ex.Message.Split(new [] {''','\''})[1] – user1027167

2

FileNotFoundException具有文件名,但DirectoryNotFoundException沒有目錄名稱,是不是有點不一致?

這是一個解決方法:在引發異常之前,使用異常的Data屬性關聯錯誤的目錄名稱。

1

檢查它Directory.Exists

+0

如果它不在他的代碼中,該怎麼辦?如果他是試圖使用該目錄的人,他可能已經擁有目錄名稱,所以它首先是一個有爭議的問題。 –

2

第一存在立即試圖找到文件的目錄,該目錄保存的名字在一個變量之前。然後爲該目錄中查找的代碼開始一個try塊。如果該代碼塊丟失,您現在擁有可用的目錄名稱。

例如:

// ... somewhere in some method that's about to search a directory. 

var dirName = directories[i]; // or something -- how do you get it before you pass it to DirectoryInfo? 

try 
{ 
    SearchDirectory(dirName); // or a block of code that does the work 
} 
catch(Exception e) 
{ 
    // at this point, you know dirName. You can log it, add it to a list of erroring 
    // directories, or whatever. You could throw here, or swallow the error after logging it, etc. 
} 
1

如果你只希望踩這個錯誤在你的IDE,那麼你可以嘗試這樣做:

在Visual Studio中,去Debug -> Exceptions,然後檢查Thrown框爲Common Language Runtime Exceptions。這會讓你在發生異常時立即獲得異常,而不是等待被捕。

4

它看起來像一個黑客,但你可以從Message財產提取路徑。至於我,我寧願首先檢查目錄存在使用Directory.Exists方法。

catch (DirectoryNotFoundException e) { 
    //Result will be: Could not find a part of the path "C:\incorrect\path". 
    Console.WriteLine(e.Message); 
    //Result will be: C:\incorrect\path 
    Console.WriteLine(e.Message.Replace("Could not find a part of the path \"","").Replace("\".","")); 
} 
+0

根據http://msdn.microsoft.com/en-us/library/system.io.directorynotfoundexception.aspx,看起來路徑的確出現在「Message」屬性中。 – BinaryTox1n

+2

+1 - 我會稱之爲黑客攻擊,因爲如果應用程序在不同的文化中運行,它將會失敗。儘管如此,這對於事先知曉文化的任何場合都是一個很好的解決方案。 (檢查Directory.Exists更糟,因爲在任何情況下都可能失敗,這意味着對於同一個問題,有兩種不同的錯誤條件!) –

+0

請記住,通常,記錄異常的正確方法不是通過使用它的消息,但通過調用'Exception.ToString()'它包含消息和其他有用的信息。 –

0

的DirectoryNotFoundException的消息成員的大多數目錄拋出的格式類方法是「Directory」輸入「未找到」。從這個字符串中提取輸入應該不難。

問題是,爲什麼需要從異常中獲取輸入參數?如果您是使用該確切參數調用方法的輸入參數?