特定のフォルダ内にあるファイル名の一覧を取得するには、Directory.GetFiles メソッドを使用します。
このメソッドでは、「ワイルドカード」を使用して特定の拡張子や名前のパターンを持つファイルだけをフィルタリングしたり、検索オプションを指定してサブフォルダまで含めて検索したりすることが可能です。
目次
ワイルドカード文字と意味
ファイル検索のパターン(searchPattern)で使用できる特殊文字です。
| ワイルドカード | 意味 | 使用例 | マッチする例 | マッチしない例 |
* (アスタリスク) | 0文字以上の任意の文字列 | *.txt | memo.txt, .txt, abc.txt | memo.log |
? (クエスチョン) | 正確に1文字の任意の文字 | data_?.csv | data_1.csv, data_A.csv | data_10.csv, data.csv |
SearchOption (検索範囲) の指定
サブフォルダの中まで探すかどうかを指定する列挙型です。
| 値 | 意味 | 動作 |
TopDirectoryOnly | 直下のディレクトリのみ | 指定したフォルダの直下にあるファイルだけを検索します(デフォルト)。 |
AllDirectories | すべてのディレクトリ | 指定したフォルダの中にあるサブフォルダ、さらにその下のフォルダ…と再帰的にすべて検索します。 |
実装サンプル:ログファイルの検索
以下のコードでは、Logs フォルダを作成し、その中にいくつかのダミーファイルを配置した後、異なるパターンとオプションを使ってファイルを検索・表示しています。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 1. テスト環境の構築(ディレクトリとダミーファイルの作成)
string rootDir = "LogData";
string subDir = Path.Combine(rootDir, "Backup");
// フォルダの作成
Directory.CreateDirectory(subDir);
// ファイルの作成
// パターン1: root直下の log_xxxx.txt
File.WriteAllText(Path.Combine(rootDir, "log_2023.txt"), "log");
File.WriteAllText(Path.Combine(rootDir, "log_2024.txt"), "log");
File.WriteAllText(Path.Combine(rootDir, "error.log"), "error"); // 拡張子が違う
// パターン2: サブフォルダ内のファイル
File.WriteAllText(Path.Combine(subDir, "log_2020.txt"), "old log");
Console.WriteLine($"--- 検索対象ディレクトリ: {rootDir} ---\n");
// ---------------------------------------------------------
// ケース1: ワイルドカード「*」と 直下のみ検索
// ---------------------------------------------------------
// "*.txt" -> 拡張子が .txt のものすべて
Console.WriteLine("[1] *.txt (直下のみ):");
string[] txtFiles = Directory.GetFiles(rootDir, "*.txt", SearchOption.TopDirectoryOnly);
foreach (var file in txtFiles)
{
Console.WriteLine($" 発見: {Path.GetFileName(file)}");
}
// ---------------------------------------------------------
// ケース2: ワイルドカード「?」と 再帰検索
// ---------------------------------------------------------
// "log_????.txt" -> log_の後ろにちょうど4文字ある .txt ファイル
// SearchOption.AllDirectories -> サブフォルダ(Backup)の中も見に行く
Console.WriteLine("\n[2] log_????.txt (サブフォルダ含む):");
string[] logFiles = Directory.GetFiles(rootDir, "log_????.txt", SearchOption.AllDirectories);
foreach (var file in logFiles)
{
// パスが長くなるのでファイル名だけ表示
Console.WriteLine($" 発見: {Path.GetFileName(file)}");
}
}
}
実行結果
--- 検索対象ディレクトリ: LogData ---
[1] *.txt (直下のみ):
発見: log_2023.txt
発見: log_2024.txt
[2] log_????.txt (サブフォルダ含む):
発見: log_2023.txt
発見: log_2024.txt
発見: log_2020.txt
解説
- 戻り値:
Directory.GetFilesは、見つかったファイルのフルパス(または相対パス)を含む文字列配列 (string[]) を返します。 ?の挙動: 結果の [2] を見て分かる通り、error.log(パターンに合わない)は除外され、サブフォルダにあるlog_2020.txtはAllDirectoriesのおかげで検出されています。- 注意点: ファイル数が数万件単位で存在するフォルダに対して
GetFilesを使うと、配列を作り切るまで処理が戻ってこないため、メモリ効率が悪くなります。その場合はDirectory.EnumerateFilesの使用を検討します。
