C# でディレクトリ内のすべてのファイルを再帰的にリストするにはどうすればよいでしょうか? 質問する

C# でディレクトリ内のすべてのファイルを再帰的にリストするにはどうすればよいでしょうか? 質問する

C# でディレクトリと子ディレクトリ内のすべてのファイルを再帰的に一覧表示するにはどうすればよいでしょうか?

ベストアンサー1

.NET 4.0 には、(配列ベースではなく) 反復子ベースのファイル関数が組み込まれている (と思われます) ことに注意してください。

foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

現時点では、以下のようなものを使用します。組み込みの再帰メソッドは、単一のサブディレクトリにアクセスできない場合、簡単に壊れてしまいます...; これをQueue<string>使用すると、コールスタックの再帰が多すぎることが回避され、反復子ブロックによって巨大な配列を持つことが回避されます。

static void Main() {
    foreach (string file in GetFiles(SOME_PATH)) {
        Console.WriteLine(file);
    }
}

static IEnumerable<string> GetFiles(string path) {
    Queue<string> queue = new Queue<string>();
    queue.Enqueue(path);
    while (queue.Count > 0) {
        path = queue.Dequeue();
        try {
            foreach (string subDir in Directory.GetDirectories(path)) {
                queue.Enqueue(subDir);
            }
        }
        catch(Exception ex) {
            Console.Error.WriteLine(ex);
        }
        string[] files = null;
        try {
            files = Directory.GetFiles(path);
        }
        catch (Exception ex) {
            Console.Error.WriteLine(ex);
        }
        if (files != null) {
            for(int i = 0 ; i < files.Length ; i++) {
                yield return files[i];
            }
        }
    }
}

おすすめ記事