その理由は、その使い方にあります。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 を超えることはできません。