3

メンバー関数は、およびDirectoryInfo::EnumerateFilesのみをスローできます。DirectoryNotFoundExceptionSecurityException

一方、静的関数Directory::EnumerateFilesは同じ例外に加えてPathTooLongException、 、UnauthorizedAccessExceptionIOException

なんで?

堅牢なコードを書く必要があります。C#でディレクトリ内のファイルを反復処理するときに例外を処理する最良の方法は何ですか?

4

3 に答える 3

2

その理由は、その使い方にあります。DirectoryInfo::EnumerateFiles現在のディレクトリで動作するため、その性質上、ディレクトリをオブジェクトにロードする作業は既に行われています - パスが長すぎるなどの心配は、DirectoryInfoオブジェクトの構築によって行われます。

DirectoryInfo di = new DirectoryInfo(...); // Gets the directory - many things could go wrong here

di.EnumerateFiles(); // Since we have a DirectoryInfo object, we already know the directory is ok - we've checked for the other problems already.

Directory.EnumerateFilesは静的メソッドです。つまり、既に正常に作成された既存のオブジェクトでは機能しません。したがって、ディレクトリをロードする必要があり (これにより、多数の例外が発生する可能性があります)、次にファイルを列挙します。

基本的には、上位 2 つのステップを 1 つにまとめたものです。

英語で別の見方をすると、次のようになります。

  • このディレクトリをオブジェクトにロードしてください c:\myfolder

DirectoryInfo myObject = new DirectoryInfo(@"C:\myfolder");

それが有効でない場合。パスが長すぎるため、ここで例外が発生します。

動作する場合は、ディレクトリに関する情報がオブジェクトに読み込まれます。だからあなたは言うことができます

  • ねえ、私が読み込んだそのディレクトリ - その上にあるファイルを列挙してください。

myObject.EnumerateFiles();

フォルダーは既に読み込まれているため、機能していて完全に問題がないことを認識しているため、もう一度行う必要はありません。唯一の可能性は見つからず (これらの 2 行の間で、コンピューター上のフォルダーを削除した場合)、列挙する権限がないことを示す SecurityException です。

もう 1 つの例では、これら 2 つの手順を組み合わせて、「このフォルダー内のすべてのファイルを列挙してください」と述べています。

そのため、フォルダーをロードし (これらすべての例外を生成する可能性があります)、ファイルをすべて 1 つのステップで列挙します。

PathTooLongException に関する情報:

フル パスを含むファイルの最大長は 260 文字です。したがって、c:\aaaaaaaaaaaaaaaaa..... のような長さ 250 文字のフォルダーがある場合、長さ 20 文字 (合計 270) のファイルをフォルダーに入れると、DirectoryInfo がスローされると考えるかもしれません。例外。

ただし、フォルダーにファイルを置くことは単に不可能です-Windowsはエラーを出します:

ファイル名が宛先フォルダーに対して長すぎます。

したがって、260 文字を超える長さのものを作成することは不可能であるため、DirectoryInfo.EnumerateFiles を騙して最大長の 260 を超えることはできません。

于 2013-07-19T12:43:14.937 に答える
0

1 回の呼び出しで実行に使用されるオブジェクトの構築と破棄を処理しているため、より多くの例外がスローされる可能性があります。

C#でディレクトリ内のファイルを反復処理するときに例外を処理する最良の方法は何ですか?

それらをどのように処理するかはあなた次第ですが、例外があなたにとって特に何かを意味し、それのために何か違うことをするつもりでない限り、次のようにしてください

try
{
    ...
}
catch (Exception ex)
{
    ...
}

それはそれらすべてをキャッチします。

それぞれを処理したい場合は、次のようになります。

try
{
}
catch (DirectoryNotFoundException ex)
{
}
catch (SecurityException ex)
{
}
etc...
于 2013-07-19T12:40:41.577 に答える