DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

あるフォルダ以下にあるサブフォルダをすべて取得する

.NET Framework 2.0以降で、Directory.GetDirectoriesメソッドのみを使う

指定したフォルダ以下にあるすべてのサブフォルダのパスを取得するには、Directory.GetDirectoriesメソッド(System.IO名前空間)を使います。GetDirectoriesメソッドは3番目のパラメータを省略(あるいは、SearchOption.TopDirectoryOnlyを指定)すると、指定したフォルダにあるサブフォルダしか取得せず、サブフォルダのサブフォルダは取得しません。サブフォルダのサブフォルダも含め、すべてのサブフォルダを取得するには、3番目のパラメータにSearchOption.AllDirectoriesを指定します。

以下の例では、フォルダ"C:\test"以下にあるサブフォルダのパスをすべて取得し、リストボックス(ListBox1)に表示しています。

VB.NET
コードを隠すコードを選択
'"C:\test"以下のサブフォルダをすべて取得する
'ワイルドカード"*"は、すべてのフォルダを意味する
Dim subFolders As String() = System.IO.Directory.GetDirectories( _
    "C:\test", "*", System.IO.SearchOption.AllDirectories)

'ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders)
C#
コードを隠すコードを選択
//"C:\test"以下のサブフォルダをすべて取得する
//ワイルドカード"*"は、すべてのフォルダを意味する
string[] subFolders = System.IO.Directory.GetDirectories(
    @"C:\test", "*", System.IO.SearchOption.AllDirectories);

//ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders);
補足:VB.NETではMy.Computer.FileSystem.GetDirectoriesメソッドでも同様のことができます。
補足:Directory.GetFileSystemEntriesメソッドを使用すると、指定したフォルダ以下にあるフォルダとファイルの両方を取得することができます。

また、DirectoryInfo.GetDirectoriesメソッドを使っても同じことができます。このメソッドの戻り値は、DirectoryInfoの配列です。

VB.NET
コードを隠すコードを選択
'"C:\test"以下のサブフォルダをすべて取得する
Dim di As New System.IO.DirectoryInfo("C:\test")
Dim subFolders As System.IO.DirectoryInfo() = _
    di.GetDirectories("*", System.IO.SearchOption.AllDirectories)

'ListBox1に結果を表示する
For Each subFolder As System.IO.DirectoryInfo In subFolders
    ListBox1.Items.Add(subFolder.FullName)
Next
C#
コードを隠すコードを選択
//"C:\test"以下のサブフォルダをすべて取得する
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\test");
System.IO.DirectoryInfo[] subFolders =
    di.GetDirectories("*", System.IO.SearchOption.AllDirectories);

//ListBox1に結果を表示する
foreach (System.IO.DirectoryInfo subFolder in subFolders)
{
    ListBox1.Items.Add(subFolder.FullName);
}

.NET Framework 4.0以降で、Directory.EnumerateDirectoriesメソッドを使う

.NET Framework 4.0からは、Directory.EnumerateDirectoriesメソッドを使っても同様のことができます。EnumerateDirectoriesメソッドの戻り値は、IEnumerable<String>です。

サブフォルダを一度にすべて取得する場合は、GetDirectoriesメソッドと比べてEnumerateDirectoriesメソッドのメリットはほとんどありません。しかし、サブフォルダを1つずつ列挙する場合は、メリットがあります。GetDirectoriesメソッドは、必ずすべてのサブフォルダを検索し終えてから結果を返すため、はじめの1つのサブフォルダを取得するだけであっても長時間かかってしまう恐れがあります。それに対してEnumerateDirectoriesメソッドは、サブフォルダが見つかればすぐに返しますので、サブフォルダの列挙で長時間ブロックされることがありません。

以下の例では、フォルダ"C:\test"以下にあるサブフォルダをすべて列挙して、1つずつListBox1に追加しています。

VB.NET
コードを隠すコードを選択
'"C:\test"以下のサブフォルダをすべて取得する
Dim subFolders As IEnumerable(Of String) = _
    System.IO.Directory.EnumerateDirectories( _
        "C:\test", "*", System.IO.SearchOption.AllDirectories)

'サブフォルダを列挙する
For Each subFolder As String In subFolders
    ListBox1.Items.Add(subFolder)
Next
C#
コードを隠すコードを選択
//"C:\test"以下のサブフォルダをすべて取得する
IEnumerable<string> subFolders =
    System.IO.Directory.EnumerateDirectories(
        @"C:\test", "*", System.IO.SearchOption.AllDirectories);

//サブフォルダを列挙する
foreach (string subFolder in subFolders)
{
    ListBox1.Items.Add(subFolder);
}
補足:EnumerateFileSystemEntriesメソッドを使用すると、あるフォルダ以下にあるフォルダとファイルの両方を取得することができます。

また、DirectoryInfo.EnumerateDirectoriesメソッドを使っても同じことができます。このメソッドの戻り値は、IEnumerable<DirectoryInfo>です。

VB.NET
コードを隠すコードを選択
'"C:\test"以下のサブフォルダをすべて取得する
Dim di As New System.IO.DirectoryInfo("C:\test")
Dim subFolders As IEnumerable(Of System.IO.DirectoryInfo) = _
    di.EnumerateDirectories("*", System.IO.SearchOption.AllDirectories)

'サブフォルダを列挙する
For Each subFolder As System.IO.DirectoryInfo In subFolders
    ListBox1.Items.Add(subFolder.FullName)
Next
C#
コードを隠すコードを選択
//"C:\test"以下のサブフォルダをすべて取得する
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\test");
IEnumerable<System.IO.DirectoryInfo> subFolders =
    di.EnumerateDirectories("*", System.IO.SearchOption.AllDirectories);

//サブフォルダを列挙する
foreach (System.IO.DirectoryInfo subFolder in subFolders)
{
    ListBox1.Items.Add(subFolder.FullName);
}

.NET Framework 1.1以前

.NET Framework 1.1以前では、Directory.GetDirectoriesメソッドに3番目のパラメータがありませんので、サブフォルダのサブフォルダまで取得できません。

例えば次のようなメソッドを作成することで、指定されたフォルダ以下のすべてのサブフォルダを取得することができるようになります。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 指定されたフォルダ以下のすべてのサブフォルダ名を取得する
''' </summary>
''' <param name="folderName">サブフォルダを調べるフォルダ名</param>
''' <param name="subFolders">取得したサブフォルダ名のリスト</param>
Public Shared Sub GetSubfolders( _
        ByVal folderName As String, ByRef subFolders As ArrayList)
    'folderNameにあるサブフォルダを取得
    Dim folder As String
    For Each folder In System.IO.Directory.GetDirectories(folderName)
        'リストに追加
        subFolders.Add(folder)
        '再帰的にサブフォルダを取得する
        GetSubfolders(folder, subFolders)
    Next folder
End Sub
C#
コードを隠すコードを選択
/// <summary>
/// 指定されたフォルダ以下のすべてのサブフォルダ名を取得する
/// </summary>
/// <param name="folderName">サブフォルダを調べるフォルダ名</param>
/// <param name="subFolders">取得したサブフォルダ名のリスト</param>
public static void GetSubfolders(
    string folderName, ref ArrayList subFolders)
{
    //folderNameにあるサブフォルダを取得
    foreach (string folder in 
        System.IO.Directory.GetDirectories(folderName))
    {
        //リストに追加
        subFolders.Add(folder);
        //再帰的にサブフォルダを取得する
        GetSubfolders(folder, ref subFolders);
    }
}

このGetSubfoldersメソッドの使い方は次のような感じです。

VB.NET
コードを隠すコードを選択
Dim subFolders As New ArrayList
'"C:\test"以下のサブフォルダをすべて取得
GetSubfolders("C:\test", subFolders)
'ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders.ToArray())
C#
コードを隠すコードを選択
ArrayList subFolders = new ArrayList();
//"C:\test"以下のサブフォルダをすべて取得
GetSubfolders(@"C:\test", ref subFolders);
//ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders.ToArray());
  • 履歴:
  • 2007/2/19 .NET Framework 2.0に関する記述を追加。
  • 2014/8/19 GetSubfoldersメソッドの使い方で、コメントの間違いを修正。
  • 2015/12/8 DirectoryInfo.GetDirectoriesメソッドや、Directory.EnumerateDirectoriesメソッドなどの説明を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。