【C#】サブフォルダも含めたファイル一覧取得

フォルダ内のファイル(絶対パス)を一覧取得するには、Directory.EnumerateFiles()を使用します。

引数としてSearchOption列挙型を指定できます。

  • SearchOption.AllDirectoriesを指定すると、サブフォルダも含めた範囲
  • SearchOption.TopDirectoryOnlyを指定すると、フォルダ直下のみが範囲(デフォルト)

以下はワイルドカード(*)を使用して「指定したフォルダパス(path)内のサブディレクトリを含めた(searchOption)、abcから始まるテキストファイル(abc*.txt)を一覧で取得する」処理を行うコードです。

// フォルダパス
var path = "D:\\勉強\\wpf\\FindFileProgect\\FindFileProgect\\Root";

// 検索パターン
var searchPattern = "abc*.txt";

// 検索範囲(サブフォルダまで含める
var searchOption = SearchOption.AllDirectories;

var resultFiles = Directory.EnumerateFiles(path, searchPattern, searchOption);
Console.WriteLine(string.Join("\n", resultFiles ));

D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\abc_01.txt
D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\abc_02.txt
D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\Sub01\abc_01.txt
D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\Sub01\abc_02.txt
D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\Sub02\abc_01.txt
D:\勉強\wpf\FindFileProgect\FindFileProgect\Root\Sub02\abc_02.txt

■フォルダ構成

D:.
│ abc_01.txt
│ abc_02.txt
│ abc_03.json
│ xyz.txt

├─Sub01
│ abc_01.txt
│ abc_02.txt
│ abc_03.json
│ xyz.txt

└─Sub02
  abc_01.txt
  abc_02.txt
  abc_03.json
  xyz.txt

おまけ

ファイル名だけ取得したい場合

Directory.EnumerateFiles()を使用すると、ファイルの「絶対パス(完全パス)」のリストとして取得されます。

パスではなくファイル名(○○.txt)のみ取得したい場合は、Path.GetFileName(filePath)を使います。

※LINQの「Select」メソッドを使用して、fiiles(ファイルパスのリスト)の各要素(ファイルパス)に対してPath.GetFileName()を使ってファイル名を抽出しています。

files = Directory.EnumerateFiles(path, searchPattern, searchOption);

// Path.GetFileName()でファイル名取得
var fileNames = files.Select(x => Path.GetFileName(x));

Console.WriteLine(string.Join("\n", fileNames));

abc_01.txt
abc_02.txt
abc_01.txt
abc_02.txt
abc_01.txt
abc_02.txt

ただこのままだとファイル名が重複してしまう問題があるので、Distinct()を使ってリストから重複を削除すると良いかもです。

files = Directory.EnumerateFiles(path, searchPattern, searchOption);

// Path.GetFileName()でファイル名取得
var fileNames = files.Select(x => Path.GetFileName(x));

// Distinct()で重複削除
fileNames = fileNames.Distinct();

Console.WriteLine(string.Join("\n", fileNames));

abc_01.txt
abc_02.txt

公式リファレンス

■Directory.EnumerateFiles メソッド

Directory.EnumerateFiles メソッド (System.IO)
指定された条件を満たすファイルの完全名から成る、列挙可能なコレクションを返します。

コメント