指定したフォルダの中にどのようなサブフォルダが存在するかを調べるには、Directory.GetDirectories メソッドを使用します。
ファイル検索と同様に、ワイルドカードによるフィルタリングや、サブフォルダのさらに奥階層まで検索するかどうかを指定できます。
ワイルドカード文字と意味
検索パターン(searchPattern)で使用できる特殊文字です。
| ワイルドカード | 意味 | 使用例 | マッチする例 | マッチしない例 |
* (アスタリスク) | 0文字以上の任意の文字列 | Data* | Data, Database, Data_Backup | MyData |
? (クエスチョン) | 正確に1文字の任意の文字 | 202? | 2023, 2024, 2025 | 202, 202301 |
SearchOption (検索範囲) の指定
さらに下の階層(孫フォルダなど)まで探すかどうかを指定します。
| 値 | 意味 | 動作 |
TopDirectoryOnly | 直下のディレクトリのみ | 指定したフォルダのすぐ下にあるフォルダだけを検索します(デフォルト)。 |
AllDirectories | すべてのディレクトリ | サブフォルダの中に含まれるフォルダも含め、最下層まですべて検索します。 |
実装サンプル:フォルダ一覧の取得
以下のコードでは、テスト用のディレクトリ階層を作成し、その中から特定の条件に合うフォルダパスを取得して表示します。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 1. テスト環境の構築(ディレクトリ階層の作成)
string rootDir = "MyDocuments";
// 直下のフォルダ
Directory.CreateDirectory(Path.Combine(rootDir, "Photos"));
Directory.CreateDirectory(Path.Combine(rootDir, "Music"));
Directory.CreateDirectory(Path.Combine(rootDir, "Work_2024"));
Directory.CreateDirectory(Path.Combine(rootDir, "Work_2025"));
// サブフォルダの中にもフォルダを作る
Directory.CreateDirectory(Path.Combine(rootDir, "Photos", "Travel"));
Console.WriteLine($"--- 検索対象: {rootDir} ---\n");
// ---------------------------------------------------------
// ケース1: すべてのフォルダを取得 (直下のみ)
// ---------------------------------------------------------
Console.WriteLine("[1] 全フォルダ (直下のみ):");
string[] allDirs = Directory.GetDirectories(rootDir, "*", SearchOption.TopDirectoryOnly);
foreach (var dir in allDirs)
{
// パス全体ではなく、フォルダ名だけを表示したい場合は Path.GetFileName を使う
Console.WriteLine($" フォルダ: {Path.GetFileName(dir)}");
}
// ---------------------------------------------------------
// ケース2: "Work_" で始まるフォルダを取得 (直下のみ)
// ---------------------------------------------------------
Console.WriteLine("\n[2] Work_* (直下のみ):");
string[] workDirs = Directory.GetDirectories(rootDir, "Work_*", SearchOption.TopDirectoryOnly);
foreach (var dir in workDirs)
{
Console.WriteLine($" 発見: {Path.GetFileName(dir)}");
}
// ---------------------------------------------------------
// ケース3: 全階層から検索 (サブフォルダの中も含む)
// ---------------------------------------------------------
Console.WriteLine("\n[3] 全検索 (AllDirectories):");
string[] recursiveDirs = Directory.GetDirectories(rootDir, "*", SearchOption.AllDirectories);
foreach (var dir in recursiveDirs)
{
// パス全体を表示して構造を分かりやすくする
Console.WriteLine($" パス: {dir}");
}
}
}
実行結果
--- 検索対象: MyDocuments ---
[1] 全フォルダ (直下のみ):
フォルダ: Music
フォルダ: Photos
フォルダ: Work_2024
フォルダ: Work_2025
[2] Work_* (直下のみ):
発見: Work_2024
発見: Work_2025
[3] 全検索 (AllDirectories):
パス: MyDocuments\Music
パス: MyDocuments\Photos
パス: MyDocuments\Work_2024
パス: MyDocuments\Work_2025
パス: MyDocuments\Photos\Travel
解説と技術的なポイント
1. 戻り値は「パスの文字列配列」
Directory.GetDirectories は DirectoryInfo オブジェクトではなく、ディレクトリのフルパス(または相対パス)を表す string[] を返します。フォルダ名だけが必要な場合は、Path.GetFileName(path) を使ってパスから末尾の名前を切り出す必要があります。
2. アクセス権限のエラーに注意
SearchOption.AllDirectories を使用してシステムフォルダ(C:\Windowsなど)や、アクセス権限のないフォルダを含む階層を検索しようとすると、UnauthorizedAccessException が発生して処理が中断されます。
権限エラーを無視して検索を続けたい場合は、標準のメソッドでは対応できないため、独自の再帰処理を書くか、Directory.EnumerateDirectories で例外処理をしながら回す工夫が必要です。
