フォルダ内のすべてのファイル名を取得したい場合、DirectoryInfoクラスを使うと便利です。
フォルダ内に下記画像のようにファイルが格納されている場合に、ファイル名をすべて取得したり、拡張子ごとにファイル名を取得することもできます。
本記事では上記フォルダを例にしていきます。
ディレクトリからファイル一覧を取得
GetFilesメソッドと、EnumerateFilesメソッドがあります。
基本的にはEnumerateFilesを使うようにしましょう。理由は後述します。
GetFiles と EnumerateFiles の使い方
現在のディレクトリからファイル一覧を返します。
※DirectoryInfoクラスは対象のディレクトリパス文字列を引数に渡して、インスタンスを生成します。
using System.IO;
// 対象ディレクトリのパス
string path = @"C:testdirectoryinfo";
// インスタンス生成
DirectoryInfo directoryInfo = new(path);
// FileInfo[] files = directoryInfo.GetFiles();
IEnumerable<FileInfo> files = directoryInfo.EnumerateFiles();
foreach (FileInfo file in files)
{
Console.WriteLine(file.Name);
}
// file01.txt
// file02.txt
// file03.txt
// file04.csv
// file05.csv
// file06.csv
拡張子を指定
引数にワイルドカードを使って拡張子を指定することもできます。
ワイルドカードには * と ? を使えます。
ワイルドカード | 説明 |
* | 0個以上の文字 |
? | 0または1個の文字 |
拡張子がcsvのファイル一覧を取得する場合、下記のように書きます。
// files = directoryInfo.GetFiles("*.csv");
files = directoryInfo.EnumerateFiles("*.csv");
foreach (FileInfo file in files)
{
Console.WriteLine(file.Name);
}
// file04.csv
// file05.csv
// file06.csv
ファイル名を条件指定
ファイル名に「file」が含まれるファイルであれば下記のように指定します。
// files = directoryInfo.GetFiles("*file*");
files = directoryInfo.EnumerateFiles("*file*");
フォルダ内の配下のファイルも含める
フォルダ内の配下にフォルダがある場合に、そのファイルも含めて取得することができます。
第二引数にSearchOption.AllDirectoriesを渡します。
// files = directoryInfo.GetFiles("*.csv", SearchOption.AllDirectories);
files = directoryInfo.EnumerateFiles("*.csv", searchOption: SearchOption.AllDirectories);
GetFiles と EnumerateFiles の違い
どちらも似ていますが、違いとしては下記があります。
- GetFiles の戻り値はFileInfo配列
- EnumerateFiles の戻り値はIEnumerable<FileInfo>
GetFilesはすべてのファイルを取得するまでレスポンスを待つ必要があります。
一方EnumerateFilesは遅延評価のため、シーケンスで返ってきます。
例として、取得したFileInfoコレクションから先頭ファイルのみ抽出する場合、EnumerateFilesの方が高速です。
// GetFiles はファイルすべてをなめるから遅い
// var files = directoryInfo.GetFiles("*.cs", searchOption: SearchOption.AllDirectories);
// EnumerateFiles は先頭で処理が終わるから速い
var files = directoryInfo.EnumerateFiles("*.cs", searchOption: SearchOption.AllDirectories);
Console.WriteLine(files.First());
特別な理由がなければEnuerateFilesを使った方が良いです。