指定したフォルダ以下にあるすべてのサブフォルダのパスを取得するには、Directory.GetDirectoriesメソッド(System.IO名前空間)を使います。GetDirectoriesメソッドは3番目のパラメータを省略(あるいは、SearchOption.TopDirectoryOnlyを指定)すると、指定したフォルダにあるサブフォルダしか取得せず、サブフォルダのサブフォルダは取得しません。サブフォルダのサブフォルダも含め、すべてのサブフォルダを取得するには、3番目のパラメータにSearchOption.AllDirectoriesを指定します。
以下の例では、フォルダ"C:\test"以下にあるサブフォルダのパスをすべて取得し、リストボックス(ListBox1)に表示しています。
'"C:\test"以下のサブフォルダをすべて取得する 'ワイルドカード"*"は、すべてのフォルダを意味する Dim subFolders As String() = System.IO.Directory.GetDirectories( _ "C:\test", "*", System.IO.SearchOption.AllDirectories) 'ListBox1に結果を表示する ListBox1.Items.AddRange(subFolders)
//"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の配列です。
'"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:\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メソッドを使っても同様のことができます。EnumerateDirectoriesメソッドの戻り値は、IEnumerable<String>です。
サブフォルダを一度にすべて取得する場合は、GetDirectoriesメソッドと比べてEnumerateDirectoriesメソッドのメリットはほとんどありません。しかし、サブフォルダを1つずつ列挙する場合は、メリットがあります。GetDirectoriesメソッドは、必ずすべてのサブフォルダを検索し終えてから結果を返すため、はじめの1つのサブフォルダを取得するだけであっても長時間かかってしまう恐れがあります。それに対してEnumerateDirectoriesメソッドは、サブフォルダが見つかればすぐに返しますので、サブフォルダの列挙で長時間ブロックされることがありません。
以下の例では、フォルダ"C:\test"以下にあるサブフォルダをすべて列挙して、1つずつListBox1に追加しています。
'"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:\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>です。
'"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:\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以前では、Directory.GetDirectoriesメソッドに3番目のパラメータがありませんので、サブフォルダのサブフォルダまで取得できません。
例えば次のようなメソッドを作成することで、指定されたフォルダ以下のすべてのサブフォルダを取得することができるようになります。
''' <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
/// <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メソッドの使い方は次のような感じです。
Dim subFolders As New ArrayList '"C:\test"以下のサブフォルダをすべて取得 GetSubfolders("C:\test", subFolders) 'ListBox1に結果を表示する ListBox1.Items.AddRange(subFolders.ToArray())
ArrayList subFolders = new ArrayList(); //"C:\test"以下のサブフォルダをすべて取得 GetSubfolders(@"C:\test", ref subFolders); //ListBox1に結果を表示する ListBox1.Items.AddRange(subFolders.ToArray());