2011-06-23 22 views
8

いくつかのディレクトリでいくつかのファイルを検索するアプリケーションを作成しました。ディレクトリが存在しない場合は、DirectoryNotFoundExceptionがスローされます。私はその例外をキャッチしますが、DirectoryNameのプロパティや、FileNotFoundException(FileName)のようなものはありません。例外プロパティからディレクトリ名を見つけるにはどうすればよいですか?C#DirectoryNotFoundExceptionからディレクトリ名を取得

+0

ディレクトリが存在しません。おそらく質問を誤解していますか? – Caimen

+0

@Caimen:どのディレクトリが存在しませんか? – SLaks

+1

見つけようとした名前がありますか? –

答えて

5

これをネイティブに行う方法はありません。

どこかにあなたのプロジェクトにこのクラスを追加します。ほとんどのディレクトリからスローDirectoryNotFoundExceptionのメッセージメンバーの形式を

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

ありがとうございます! – Sp3ct3R

+0

私の場合、二重引用符を探す必要がありました:ex.Message.Split(new [] {'"'、 '\' '}))[1] – user1027167

2

FileNotFoundExceptionにファイル名がありますが、DirectoryNotFoundExceptionにはディレクトリ名がありませんか?

回避策:例外をスローする前に、例外のDataプロパティを使用して、間違ったディレクトリ名を関連付けます。それはDirectory.Exists

1

チェックすぐにあなたは、ディレクトリ内のファイルを検索する変数にディレクトリの名前を保存しようとする前に。その後、そのディレクトリを参照するコードのtryブロックを開始します。そのコードブロックがスローされると、ディレクトリ名を使用できるようになりました。例えば

:あなただけのIDEにこの1個のバグを踏みつけるするために探している場合

// ... 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. 
} 
+0

コードに含まれていない場合はどうなりますか?彼がディレクトリを使用しようとしているなら、彼はすでにディレクトリ名を持っている可能性が高いので、最初は疑問点です。 –

1

、その後、あなたはこれをやって試すことができます:

Visual Studioで、Debug -> Exceptionsに行き、その後、確認してくださいボックス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のチェックは悪いハックです。これは何らかの事情で失敗する可能性があるため、同じ問題に対して2つの異なるエラー条件があることを意味します)。 –

+0

一般的に、例外を記録する適切な方法は、そのメッセージに加えて、メッセージとその他の有用な情報を含む 'Exception.ToString()'を呼び出すことによって、 –

0

:例外

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; 
    } 
} 

キャッチをし、このようなタイプの拡張機能を使用します"ディレクトリ '入力'が見つかりませんでした。"この文字列から入力を抽出するのは難しいことではありません。

質問あなたは、その正確なパラメータでメソッドを呼び出すのであれば、例外から入力パラメータを取得する必要があるのはなぜですか?

1

古い記事を掘り下げて申し訳ありませんが、FileNotFoundExceptionがそうであればDirectoryNotFoundExceptionがプロパティとしてディレクトリを持っていないというのは、

私は.NETの機能要求としてそれを入れてきました:ディレクトリは、あなたがDirectoryNotFoundExceptionを得た場合、あなたは確かに場合ディレクトリ名を見つけるつもりされていない存在しない

http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4472498-directorynotfoundexception-should-expose-the-name-

関連する問題