C#

【C#】ディレクトリにあるファイルを全て取得する方法

プログラムを書いていると、ディレクトリ内にあるファイルを全て取得し何か処理をしたいという場面があると思います。

今回はそのような場面で活用できる、カンタンにディレクトリにあるファイルを全て取得する方法を紹介します。

Directory.GetFilesを使う

C#の標準ライブラリであるDirectoryというクラスがあります。

このクラスにはディレクトリ関連の操作が集約されています。このDirectoryクラスのメソッドの1つにGetFilesというのがあるので、このメソッドを使うことでカンタンにファイルの一覧が取得可能です。

Directory.GetFile仕様

以下Microsoftサイトより↓

メソッドオーバーロードで引数違いのメソッドが3つ定義されています。

パラメーター

引数名 内容
引数1 path string ファイルのパス
引数2 searchPattern string ファイル名と対応させる検索文字列
引数3 searchOption SearchOption 検索操作にすべてのサブディレクトリを含めるのか、または現在のディレクトリのみを含めるのかを指定する列挙値

戻り値

string型

指定したディレクトリ内の指定した検索パターンおよびオプションに一致するファイルの完全名 (パスを含む) の配列

GetFilesメソッドの使い方

サンプルコードを紹介しておきます。

Cドライブ直下に以下のようにファイルとディレクトリを作成した状態で使い方を紹介します。

test/ sample1.txt
sample2.txt
sample3.c
test-sub/ sample1.txt
sample2.txt
sample3.c

使用例①:引数のディレクトリ直下のファイルのみ抜き出す

この場合、単純に第一引数にフォルダパスを指定するだけ。

こうするとこうなる。↓

使用例②:特定の文字列パターンにマッチするファイルのみ抜き出す

この場合、第2引数にマッチさせたいパターンを指定します。

testフォルダ内で拡張子が.txtのファイルを全て取得するようパターンを指定してみましょう。

*(アスタリスク)はワイルドカードという、いわゆる検索をカンタンにするための指定文字列の1つです。*を指定すると指定した位置にに0個以上の文字があればマッチします。

こう引数指定すると、こうなる。↓

“3.c”のファイルがパターンにマッチしていなかったため、取得したファイルに含まれませんね。

 

ワイルドカードには*以外に?も使うことが可能です。こちらも紹介しておきます。

?は指定した位置に 0 個または 1 つの文字がある場合にマッチします。

この場合だとsampleで始まり、その後0個または1つの文字列があり、その後が.txtのファイルが検索対象になります。

こう引数指定すると、こうなる。↓

 

使用例③:特定の文字列パターンにマッチするファイルをサブディレクトリも含めて抜き出す

この場合、第2引数にマッチさせたいパターンを指定します。

testフォルダ内で拡張子が.txtのファイルを全て取得するようパターンを指定してみましょう。

こう引数指定すると、こうなる。↓

サブディレクトリのサブディレクトリもしっかり見てくれるので、とてもカンタンに全てのフォルダを検索できて便利です。

DirectoryInfo.EnumerateFilesを使う

DirectoryInfoというクラスが別にあるので、こちらを使う方法でもファイル検索ができます。メソッドに渡す引数はDirectory.GetFilesと同じです。

DirectoryとDirectoryInfoのどちらが良いの?

マイクロソフトのホームページで調べましたが、結論を言うとDirecotryInfo.EnumerateFilesの方が良いです。

DirectoryInfo.EnumerateFilesの方が配列にアクセスする処理を行う際に待ちが発生しないので処理速度が速いのに対し、Directory.GetFilesは配列全体が返るまでに待ちが発生するので処理速度が遅いです。

大量のファイルやフォルダを処理するならDirectoryInfo.EnumerateFilesを使いましょう。

使用する際の注意点

一番の注意ポイントとしては検索パターン文字列の指定方法でしょう。

例えば、第2引数で”*.xls”と指定した場合、.xlsのファイルは全て抜き出せますが、それと一緒に”.xlsx”のファイルも抜き出されます。

これは.xlsxの拡張子に.xlsの文字列も含まれるからなんですね。余分なファイルまでマッチしてしまい、不具合につながるので注意してくださいね。