【C#】指定したディレクトリにあるサブディレクトリ(フォルダ)一覧を取得する (Directory.GetDirectories)

指定したフォルダの中にどのようなサブフォルダが存在するかを調べるには、Directory.GetDirectories メソッドを使用します。

ファイル検索と同様に、ワイルドカードによるフィルタリングや、サブフォルダのさらに奥階層まで検索するかどうかを指定できます。

目次

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

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

ワイルドカード意味使用例マッチする例マッチしない例
* (アスタリスク)0文字以上の任意の文字列Data*Data, Database, Data_BackupMyData
? (クエスチョン)正確に1文字の任意の文字202?2023, 2024, 2025202, 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.GetDirectoriesDirectoryInfo オブジェクトではなく、ディレクトリのフルパス(または相対パス)を表す string[] を返します。フォルダ名だけが必要な場合は、Path.GetFileName(path) を使ってパスから末尾の名前を切り出す必要があります。

2. アクセス権限のエラーに注意

SearchOption.AllDirectories を使用してシステムフォルダ(C:\Windowsなど)や、アクセス権限のないフォルダを含む階層を検索しようとすると、UnauthorizedAccessException が発生して処理が中断されます。

権限エラーを無視して検索を続けたい場合は、標準のメソッドでは対応できないため、独自の再帰処理を書くか、Directory.EnumerateDirectories で例外処理をしながら回す工夫が必要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次