C#でディレクトリ(フォルダー)の中にあるディレクトリの一覧を取得する方法について紹介します。
ディレクトリ内のディレクトリの一覧を取得するには、System.IO名前空間のDirectoryInfoクラスのGetDirectoriesメソッドや、DirectoryクラスのGetDirectories静的メソッドなどを使用します。
目次
DirectoryInfoクラスのGetDirectoriesメソッドで取得
DirectoryInfoクラスのGetDirectoriesメソッドの構文は次のようになります。
1 |
public System.IO.DirectoryInfo[] GetDirectories (); |
1 |
public System.IO.DirectoryInfo[] GetDirectories (string searchPattern); |
1 |
public System.IO.DirectoryInfo[] GetDirectories (string searchPattern, System.IO.SearchOption searchOption); |
引数を取らないGetDirectoriesメソッドでは、DirectoryInfoオブジェクトのディレクトリ内のすべてのディレクトリを取得できます。
引数1つ(searchPattern)を取るGetDirectoriesメソッドでは、検索するパターンを指定してディレクトリの一覧を取得できます。
検索するパターンは文字列で指定します。文字列にはリテラル文字とワイルドカード文字が指定できます。ワイルドカード文字には「*」と「?」が使用でき、「*」は指定した位置に0個以上の文字列が含まれているかどうかを示し、「?」は指定した位置に0個または1個の文字列が含まれているかどうかを示します。例えばディレクトリ名が「abc」で始まり「xyz」で終わるディレクトリを検索する場合は「abc*xyz」を指定します。
引数2つ(searchPatternとsearchOption)を取るGetDirectoriesメソッドでは、検索するパターンと検索対象をDirectoryInfoオブジェクトのディレクトリの直下のみにするか、すべてのサブディレクトリを含めるかを指定してディレクトリの一覧を取得できます。ディレクトリの直下のみにするか、すべてのサブディレクトリを含めるかはSystem.IO.SearchOption列挙型で指定します。System.IO.SearchOption列挙型には「TopDirectoryOnly」と「AllDirectories」があり、「TopDirectoryOnly」を指定すると対象のディレクトリの直下のみになり、「AllDirectories」を指定するとすべてのサブディレクトリを含みます。
DirectoryInfo.GetDirectoriesメソッドの使用例
以下にGetDirectoriesメソッドを使用してディレクトリの一覧を取得する例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// ディレクトリパス string path = @"C:\Test\ParentDir"; // DirectoryInfoのインスタンスを生成する DirectoryInfo di = new DirectoryInfo(path); // ディレクトリ直下のすべてのディレクトリ一覧を取得する DirectoryInfo[] diAlls = di.GetDirectories(); foreach (DirectoryInfo d in diAlls) { Console.WriteLine($"{d.FullName}"); } // ディレクトリ直下の「作業用」という文字をディレクトリ名に含むディレクトリの一覧を取得する DirectoryInfo[] diPatterns = di.GetDirectories("*作業用*"); foreach (DirectoryInfo d in diPatterns) { Console.WriteLine($"{d.FullName}"); } // ディレクトリ以下のすべてのサブディレクトリの一覧を取得する DirectoryInfo[] diOptions = di.GetDirectories("*", SearchOption.AllDirectories); foreach (DirectoryInfo d in diOptions) { Console.WriteLine($"{d.FullName}"); } |
引数を2つ指定するGetDirectoriesメソッドですべてのディレクトリを対象にする場合は、検索パターン(searchPattern)に「*」を指定します。
DirectoryクラスのGetDirectories静的メソッドで取得
DirectoryクラスのGetDirectories静的メソッドの構文は次のようになります。
1 |
public static string[] GetDirectories (string path); |
1 |
public static string[] GetDirectories (string path, string searchPattern); |
1 |
public static string[] GetDirectories (string path, string searchPattern, System.IO.SearchOption searchOption); |
DirectoryクラスのGetDirectories静的メソッドには、検索対象とするディレクトリのパスを第1引数に指定します。引数を2つ取るもの、引数を3つ取るものは、DirectoryInfoクラスのGetDirectoriesと同様です。
Directory.GetDirectories静的メソッドの使用例
以下にGetDirectories静的メソッドを使用してディレクトリの一覧を取得する例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// ディレクトリパス string path = @"C:\Test\ParentDir"; // ディレクトリ直下のすべてのディレクトリ一覧を取得する string[] diAlls = Directory.GetDirectories(path); foreach (string s in diAlls) { Console.WriteLine($"{s}"); } // ディレクトリ直下の「作業用」という文字をディレクトリ名に含むディレクトリの一覧を取得する string[] diPatterns = Directory.GetDirectories(path, "*作業用*"); foreach (string s in diPatterns) { Console.WriteLine($"{s}"); } // ディレクトリ以下のすべてのサブディレクトリの一覧を取得する string[] diOptions = Directory.GetDirectories(path, "*", SearchOption.AllDirectories); foreach (string s in diOptions) { Console.WriteLine($"{s}"); } |
DirectoryInfoクラスのGetDirectoriesメソッドは戻り値にDirectoryInfoの配列を返しますが、DirectoryクラスのGetDirectories静的メソッドはディレクトリのパスの配列(string[])を返します。
サンプルプログラム
Windowsフォームアプリケーションでのプログラムの実装例を記載します。
ユーザーインターフェース
フォームのインターフェースは次のようにします。
ソースコード
サンプルプログラムのフォームには次のようなソースコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
using System; using System.Windows.Forms; // System.IOのusingを追加 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // DirectoryInfoクラスのGetDirectoriesメソッドでディレクトリ直下のすべてのディレクトリを取得 private void button1_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // DirectoryInfoのインスタンスを生成 DirectoryInfo di = new DirectoryInfo(path); // ディレクトリを取得 DirectoryInfo[] directories = di.GetDirectories(); // リストボックスに表示 listBox1.Items.Clear(); foreach (DirectoryInfo d in directories) { listBox1.Items.Add(d.FullName); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryInfoクラスのGetDirectoriesメソッドで検索パターンを指定してディレクトリ直下のすべてのディレクトリを取得 private void button2_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // DirectoryInfoのインスタンスを生成 DirectoryInfo di = new DirectoryInfo(path); // 検索パターン string searchPattern = textBox2.Text; // ディレクトリを取得 DirectoryInfo[] directories = di.GetDirectories(searchPattern); // リストボックスに表示 listBox1.Items.Clear(); foreach (DirectoryInfo d in directories) { listBox1.Items.Add(d.FullName); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryInfoクラスのGetDirectoriesメソッドで検索パターンと検索オプションを指定してディレクトリを取得 private void button3_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // DirectoryInfoのインスタンスを生成 DirectoryInfo di = new DirectoryInfo(path); // 検索パターン string searchPattern = textBox2.Text; // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ディレクトリを取得 DirectoryInfo[] directories = di.GetDirectories(searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (DirectoryInfo d in directories) { listBox1.Items.Add(d.FullName); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのGetDirectories静的メソッドでディレクトリ直下のすべてのディレクトリを取得 private void button4_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // ディレクトリを取得 string[] directories = Directory.GetDirectories(path); // リストボックスに表示 listBox1.Items.Clear(); foreach (string d in directories) { listBox1.Items.Add(d); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのGetDirectories静的メソッドで検索パターンを指定してディレクトリ直下のすべてのディレクトリを取得 private void button5_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // 検索パターン string searchPattern = textBox2.Text; // ディレクトリを取得 string[] directories = Directory.GetDirectories(path, searchPattern); // リストボックスに表示 listBox1.Items.Clear(); foreach (string d in directories) { listBox1.Items.Add(d); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのGetDirectories静的メソッドで検索パターンと検索オプションを指定してディレクトリを取得 private void button6_Click(object sender, EventArgs e) { try { // ディレクトリパス string path = textBox1.Text; // 検索パターン string searchPattern = textBox2.Text; // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ディレクトリを取得 string[] directories = Directory.GetDirectories(path, searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (string d in directories) { listBox1.Items.Add(d); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルの実行結果
上記のサンプルプログラムを実行すると、以下のように画面の条件に一致するディレクトリの一覧をリストボックスに表示します。
列挙可能なディレクトリ情報のコレクションを取得
列挙可能なディレクトリ情報のコレクションを返すメソッドとして、DirectoryInfoクラスにはEnumerateDirectoriesメソッドが、DirectoryクラスにはEnumerateDirectories静的メソッドが用意されています。
DirectoryInfoクラスのEnumerateDirectoriesメソッドはGetDirectoriesメソッドと同様の引数が指定でき、戻り値にSystem.Collections.Generic.IEnumerable<System.IO.DirectoryInfo>型のオブジェクトのコレクションを返します。
DirectoryクラスにはEnumerateDirectories静的メソッドもGetDirectories静的メソッドと同様の引数が指定でき、戻り値にSystem.Collections.Generic.IEnumerable<string>型のオブジェクトのコレクションを返します。
DirectoryInfo.EnumerateDirectoriesメソッドの使用例
以下にEnumerateDirectoriesメソッドを使用してディレクトリの一覧を取得する例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// ディレクトリパス string path = @"C:\Test\ParentDir"; // DirectoryInfoのインスタンスを生成する DirectoryInfo di = new DirectoryInfo(path); // ディレクトリ直下のすべてのディレクトリ一覧を取得する IEnumerable<DirectoryInfo> diAlls = di.EnumerateDirectories(); foreach (DirectoryInfo d in diAlls) { Console.WriteLine(d.FullName); } // ディレクトリ直下の「Work」という文字をディレクトリ名に含むディレクトリの一覧を取得する IEnumerable<DirectoryInfo> diPatterns = di.EnumerateDirectories("*Work*"); foreach (DirectoryInfo d in diPatterns) { Console.WriteLine(d.FullName); } // ディレクトリ以下のすべてのサブディレクトリの一覧を取得する IEnumerable<DirectoryInfo> diOptions = di.EnumerateDirectories("*", SearchOption.AllDirectories); foreach (DirectoryInfo d in diOptions) { Console.WriteLine(d.FullName); } |
Directory.EnumerateDirectories静的メソッドの使用例
以下にEnumerateDirectories静的メソッドを使用してディレクトリの一覧を取得する例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// ディレクトリパス string path = @"C:\Test\ParentDir"; // ディレクトリ直下のすべてのディレクトリ一覧を取得する IEnumerable<string> alls = Directory.EnumerateDirectories(path); foreach (string s in alls) { Console.WriteLine(s); } // ディレクトリ直下の「Work」という文字をディレクトリ名に含むディレクトリの一覧を取得する IEnumerable<string> patterns = Directory.EnumerateDirectories(path, "*Work*"); foreach (string s in patterns) { Console.WriteLine(s); } // ディレクトリ以下のすべてのサブディレクトリの一覧を取得する IEnumerable<string> options = Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories); foreach (string s in options) { Console.WriteLine(s); } |
GetDirectoriesメソッドは、ディレクトリのツリービューなどを作成する場合に大活躍するメソッドですので、覚えておいて損はないと思います。
参考記事
ファイルの一覧を取得する方法については、以下の記事をご参照ください。