C#

【C#】DirectoryInfoでフォルダ内すべてのファイル名を取得

フォルダ内のすべてのファイル名を取得したい場合、DirectoryInfoクラスを使うと便利です。

フォルダ内に下記画像のようにファイルが格納されている場合に、ファイル名をすべて取得したり、拡張子ごとにファイル名を取得することもできます。

本記事では上記フォルダを例にしていきます。

ディレクトリからファイル一覧を取得

GetFilesメソッドと、EnumerateFilesメソッドがあります。

基本的にはEnumerateFilesを使うようにしましょう。理由は後述します。

GetFiles と EnumerateFiles の使い方

現在のディレクトリからファイル一覧を返します。

※DirectoryInfoクラスは対象のディレクトリパス文字列を引数に渡して、インスタンスを生成します。

using System.IO;

// 対象ディレクトリのパス
string path = @"C:\test\directoryinfo";
// インスタンス生成
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を使った方が良いです。

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい