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

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

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

指定したフォルダにあるすべてのサブフォルダのパスを取得するには、System.IO.Directory.GetDirectoriesメソッドを使います。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:\My Documents"以下のサブフォルダをすべて取得する
//ワイルドカード"*"は、すべてのフォルダを意味する
string[] subFolders = System.IO.Directory.GetDirectories(
    @"C:\test", "*", System.IO.SearchOption.AllDirectories);

//ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders);
補足:VB.NETではMy.Computer.FileSystem.GetDirectoriesメソッドでも同様のことができます。

.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:\My Documents"以下のサブフォルダをすべて取得
GetSubfolders("C:\test", subFolders)
'ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders.ToArray())
C#
コードを隠すコードを選択
ArrayList subFolders = new ArrayList();
//"C:\My Documents"以下のサブフォルダをすべて取得
GetSubfolders(@"C:\test", ref subFolders);
//ListBox1に結果を表示する
ListBox1.Items.AddRange(subFolders.ToArray());
  • 履歴:
  • 2007/2/19 .NET Framework 2.0に関する記述を追加。

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

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。