閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

任意のディレクトリの下にあるファイルを再帰的に見に行く

特定のディレクトリの下にあるすべてのファイルを再帰的に見たい、という場合、Directory.GetFilesメソッドに再帰オプションを指定すると良いようです。

// GetFilesの第三引数に SearchOption.AllDirectories を指定すると、サブディレクトリも再帰的に見てくれる
foreach (string file in Directory.GetFiles(@"C:\hoge\", "*", SearchOption.AllDirectories))
{
  Console.WriteLine(file);
}

実はこのオプションはこれを書いているたったいま知ったことで、この間までは以下のようなメソッドをわざわざ作っていましたorz

static IEnumerable<string> GetFileList(string dir)
{
  foreach (string sub in Directory.GetDirectories(dir))
  {
    foreach (string file in GetFileList(sub))
    {
      yield return file;
    }
  }

  foreach (string file in Directory.GetFiles(dir))
  {
    yield return file;
  }
}

// こう使う
foreach (var file in GetFileList(@"C:\hoge\")) {
  Console.WriteLine(file);
}

最近の.NETで再帰的に見てくれるオプションとかないかなー*1と思って見たらとっくの昔からあったという。

.NET Framework 4からはDirectory.EnumerateFilesメソッドが追加されたようです。使い方はGetFilesと全く同じですが、戻り値が配列ではなくIEnumerableになって効率が良くなっているとのことです。こちらの方が適している場面も多そうですね。



Directory.EnumerateDirectories メソッド (String, String, SearchOption) (System.IO)

*1:Directory.Deleteメソッドにはあるので