2019年9月8日プログラムを書いていると、ディレクトリ内にあるファイルを全て取得し何か処理をしたいという場面があると思います。今回はそのような場面で活用できる、カンタンにディレクトリにあるファイルを全て取得する方法を紹介します。使用例1:引数のディレクトリ直下のファイルのみ抜き出す使用例2:特定の文字列パターンにマッチするファイルのみ抜き出す使用例3:特定の文字列パターンにマッチするファイルをサブディレクトリも含めて抜き出すDirectoryInfo.EnumerateFilesを使うDirectoryとDirectoryInfoのどちらが良いの?使用する際の注意点Directory.GetFilesを使うC#の標準ライブラリであるDirectoryというクラスがあります。このクラスにはディレクトリ関連の操作が集約されています。このDirectoryクラスのメソッドの1つにGetFilesというのがあるので、このメソッドを使うことでカンタンにファイルの一覧が取得可能です。searchOption);メソッドオーバーロードで引数違いのメソッドが3つ定義されています。配列GetFilesメソッドの使い方サンプルコードを紹介しておきます。Cドライブ直下に以下のようにファイルとディレクトリを作成した状態で使い方を紹介します。sample1.txtsample2.txtsample3.c使用例1:引数のディレクトリ直下のファイルのみ抜き出すこの場合、単純に第一引数にフォルダパスを指定するだけ。サンプルソースC#Directory.GetFiles(@"C:\test");1Directory.GetFiles(@"C:\test");こうするとこうなる。C:\test\sample3.c123C:\test\sample1.txtC:\test\sample2.txtC:\test\sample3.c使用例2:特定の文字列パターンにマッチするファイルのみ抜き出すこの場合、第2引数にマッチさせたいパターンを指定します。testフォルダ内で拡張子が.txtのファイルを全て取得するようパターンを指定してみましょう。サンプルソースC#Directory.GetFiles(@"C:\test","*.txt");1Directory.GetFiles(@"C:\test","*.txt");*(アスタリスク)はワイルドカードという、いわゆる検索をカンタンにするための指定文字列の1つです。*を指定すると指定した位置にに0個以上の文字があればマッチします。引数指定すると、こうなる。C:\test\sample2.txt12C:\test\sample1.txtC:\test\sample2.txt“3.c”のファイルがパターンにマッチしていなかったため、取得したファイルに含まれませんね。ワイルドカードには*以外に?も使うことが可能です。こちらも紹介しておきます。つの文字がある場合にマッチします。サンプルソースC#Directory.GetFiles(@"C:\test","sample?.txt");1Directory.GetFiles(@"C:\test","sample?.txt");この場合だとsampleで始まり、その後0個または1つの文字列があり、その後が.txtのファイルが検索対象になります。引数指定すると、こうなる。C:\test\sample2.txt12C:\test\sample1.txtC:\test\sample2.txt使用例3:特定の文字列パターンにマッチするファイルをサブディレクトリも含めて抜き出すこの場合、第2引数にマッチさせたいパターンを指定します。testフォルダ内で拡張子が.txtのファイルを全て取得するようパターンを指定してみましょう。SearchOption.AllDirectories);こう引数指定すると、こうなる。C:\test\test-sub\sample2.txt1234C:\test\sample1.txtC:\test\sample2.txtC:\test\test-sub\sample1.txtC:\test\test-sub\sample2.txtサブディレクトリのサブディレクトリもしっかり見てくれるので、とてもカンタンに全てのフォルダを検索できて便利です。DirectoryInfo.EnumerateFilesを使うDirectoryInfoというクラスが別にあるので、こちらを使う方法でもファイル検索ができます。メソッドに渡す引数はDirectory.GetFilesと同じです。searchOption);DirectoryとDirectoryInfoのどちらが良いの?マイクロソフトのホームページで調べましたが、結論を言うとDirecotryInfo.EnumerateFilesの方が良いです。DirectoryInfo.EnumerateFilesの方が配列にアクセスする処理を行う際に待ちが発生しないので処理速度が速いのに対し、Directory.GetFilesは配列全体が返るまでに待ちが発生するので処理速度が遅いです。大量のファイルやフォルダを処理するならDirectoryInfo.EnumerateFilesを使いましょう。注意ポイントとしては検索パターン文字列の指定方法でしょう。第2引数で”*.xls”と指定した場合、.xlsのファイルは全て抜き出せますが、それと一緒に”.xlsx”のファイルも抜き出されます。これは.xlsxの拡張子に.xlsの文字列も含まれるからなんですね。余分なファイルまでマッチしてしまい、不具合につながるので注意してくださいね。bombkunボムログ【C#】ファイルパスから拡張子を除いたファイル名を抜き出す方法プログラミングスキルはコスパが良い。ブロガーボムクン技術系ブログを中心とした雑記を書いています。