【C#】指定したディレクトリにあるファイル一覧を検索・取得する (Directory.GetFiles)

特定のフォルダ内にあるファイル名の一覧を取得するには、Directory.GetFiles メソッドを使用します。

このメソッドでは、「ワイルドカード」を使用して特定の拡張子や名前のパターンを持つファイルだけをフィルタリングしたり、検索オプションを指定してサブフォルダまで含めて検索したりすることが可能です。

目次

ワイルドカード文字と意味

ファイル検索のパターン(searchPattern)で使用できる特殊文字です。

ワイルドカード意味使用例マッチする例マッチしない例
* (アスタリスク)0文字以上の任意の文字列*.txtmemo.txt, .txt, abc.txtmemo.log
? (クエスチョン)正確に1文字の任意の文字data_?.csvdata_1.csv, data_A.csvdata_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

解説

  1. 戻り値: Directory.GetFiles は、見つかったファイルのフルパス(または相対パス)を含む文字列配列 (string[]) を返します。
  2. ? の挙動: 結果の [2] を見て分かる通り、error.log(パターンに合わない)は除外され、サブフォルダにある log_2020.txtAllDirectories のおかげで検出されています。
  3. 注意点: ファイル数が数万件単位で存在するフォルダに対して GetFiles を使うと、配列を作り切るまで処理が戻ってこないため、メモリ効率が悪くなります。その場合は Directory.EnumerateFiles の使用を検討します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次