C#でディレクトリ(フォルダー)の中にあるディレクトリとファイルを一括で取得する方法について紹介します。
ディレクトリ内のディレクトリとファイルの一覧を取得するには、System.IO名前空間のDirectoryInfoクラスのGetFileSystemInfosメソッドや、DirectoryクラスのGetFileSystemEntries静的メソッドなどを使用します。
目次
DirectoryInfoクラスのGetFileSystemInfosメソッドで取得
DirectoryInfoクラスのGetFileSystemInfosメソッドの構文は次のようになります。
1 |
public System.IO.FileSystemInfo[] GetFileSystemInfos (); |
1 |
public System.IO.FileSystemInfo[] GetFileSystemInfos (string searchPattern); |
1 |
public System.IO.FileSystemInfo[] GetFileSystemInfos (string searchPattern, System.IO.SearchOption searchOption); |
GetFileSystemInfosメソッドは引数を指定せずに呼び出すと、DirectoryInfoオブジェクトのディレクトリ内のすべてのディレクトリおよびファイルの一覧を返します。
引数のsearchPatternのみを指定すると、取得するディレクトリとファイルの名前の検索パターン文字列を指定できます。
検索パターンにはリテラル文字とワイルドカード文字の「*」と「?」が指定できます。検索パターンに「*」を含めると指定した位置に0個または1個の文字列が含まれているかどうかを条件に、ディレクトリおよびファイルの一覧を取得できます。検索パターンに「?」を含めると指定した位置に0個または1個の文字列が含まれているかどうかを条件に、ディレクトリおよびファイルの一覧を取得できます。
例えばファイル名が「begin」で始まり「end」で終わる名前のディレクトリとファイルを対象にするなら検索パターン文字列を「begin*end」とします。「abc」と「efg」の間に任意の1文字を含む名前のディレクトリとファイルが対象であれば「abc?efg」という文字列を指定します。
引数のsearchPatternとsearchOptionを指定すると、名前の検索パターンと、検索対象のディレクトリとしてすべてのサブディレクトリを含めるかどうかを指定できます。
サブディレクトリを含めるかどうかはSystem.IO.SearchOption列挙型で指定します。System.IO.SearchOption列挙型には「AllFiles」と「TopDirectoryOnly」があり、「AllFiles」を指定するとすべてのサブディレクトリを対象に含んで一覧を取得し、「TopDirectoryOnly」を指定するとサブディレクトリを含まずに一覧を取得して返します。
DirectoryInfo.GetFileSystemInfosメソッドの使用例
GetFileSystemInfosメソッドを使用してディレクトリとファイルの一覧を取得する例を以下に示します。
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); // ディレクトリ直下のすべてのファイル一覧を取得する FileSystemInfo[] fsiAlls = di.GetFileSystemInfos(); foreach (FileSystemInfo f in fsiAlls) { Console.WriteLine($"{f.FullName}"); } // ディレクトリ直下の「月例」という文字をファイル名に含むファイルの一覧を取得する FileSystemInfo[] fsiPatterns = di.GetFileSystemInfos("*月例*"); foreach (FileSystemInfo f in fsiPatterns) { Console.WriteLine($"{f.FullName}"); } // ディレクトリ以下のすべてのサブディレクトリのファイル一覧を取得する FileSystemInfo[] fsiOptions = di.GetFileSystemInfos("*", SearchOption.AllDirectories); foreach (FileSystemInfo f in fsiOptions) { Console.WriteLine($"{f.FullName}"); } |
上記の例で、引数を2つ指定するGetFileSystemInfosメソッドで第1引数の検索パターンに「*」を指定しているのは、すべてのディレクトリを対象にするためです。
DirectoryクラスのGetFileSystemEntries静的メソッドで取得
DirectoryクラスのGetFileSystemEntries静的メソッドの構文は次のようになります。
1 |
public static string[] GetFileSystemEntries (string path); |
1 |
public static string[] GetFileSystemEntries (string path, string searchPattern); |
1 |
public static string[] GetFileSystemEntries (string path, string searchPattern, System.IO.SearchOption searchOption); |
DirectoryクラスのGetFileSystemEntries静的メソッドには検索対象とするディレクトリを第1引数に指定します。引数を2つ取るものと引数を3つ取るものは、DirectoryInfoクラスのGetFileSystemEntriesと同様に、検索パターンとすべてのサブディレクトリを含めるかどうかを指定します。
Directory.GetFileSystemEntries静的メソッドの使用例
以下にGetFileSystemEntries静的メソッドを使用してディレクトリとファイルの一覧を取得する例を示します。
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[] allFileSystems = Directory.GetFileSystemEntries(path); foreach (string fs in allFileSystems) { Console.WriteLine($"{fs}"); } // ディレクトリ直下の「定例」という文字をファイル名に含むディレクトリとファイルの一覧を取得する string[] patternFileSystems = Directory.GetFileSystemEntries(path, "*定例*"); foreach (string fs in patternFileSystems) { Console.WriteLine($"{fs}"); } // ディレクトリ以下のすべてのサブディレクトリとファイルの一覧を取得する string[] optionFileSystems = Directory.GetFileSystemEntries(path, "*", SearchOption.AllDirectories); foreach (string fs in optionFileSystems) { Console.WriteLine($"{fs}"); } |
DirectoryInfoクラスのGetFileSystemFilesメソッドは戻り値にFileSystemInfoの配列を返しますが、DirectoryクラスのGetFileSystemEntries静的メソッドはファイルパスの文字列の配列(string[])を返します。
列挙可能なディレクトリ情報のコレクションを取得
列挙可能なファイル情報のコレクションを返すメソッドとして、DirectoryInfoクラスにはEnumerateFileSystemInfosメソッドが、DirectoryクラスにはEnumerateFileSystemEntries静的メソッドが用意されています。
DirectoryInfoクラスのEnumerateFileSystemInfosメソッドはGetFileSystemInfosメソッドと同様の引数が指定できまる。戻り値にはSystem.Collections.Generic.IEnumerable
DirectoryクラスにはEnumerateFileSystemEntries静的メソッドもGetFiles静的メソッドと同様の引数が指定できます。戻り値にはSystem.Collections.Generic.IEnumerable
DirectoryInfo.EnumerateFileSystemInfosメソッドの使用例
以下にEnumerateFileSystemInfosメソッドを使用してディレクトリとファイルの一覧を取得する例を示します。
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<FileSystemInfo> fiAlls = di.EnumerateFileSystemInfos(); foreach (FileSystemInfo f in fiAlls) { Console.WriteLine(f.FullName); } // ディレクトリ直下の「List」という文字をファイル名に含むファイルの一覧を取得する IEnumerable<FileSystemInfo> fiPatterns = di.EnumerateFileSystemInfos("*List*"); foreach (FileSystemInfo f in fiPatterns) { Console.WriteLine(f.FullName); } // ディレクトリ以下のすべてのサブディレクトリを含むファイルの一覧を取得する IEnumerable<FileSystemInfo> fiOptions = di.EnumerateFileSystemInfos("*", SearchOption.AllDirectories); foreach (FileSystemInfo f in fiOptions) { Console.WriteLine(f.FullName); } |
Directory.EnumerateFileSystemInfos静的メソッドの使用例
以下にEnumerateFileSystemInfos静的メソッドを使用してディレクトリとファイルの一覧を取得する例を示します。
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> allFileSystems = Directory.EnumerateFileSystemEntries(path); foreach (string fs in allFileSystems) { Console.WriteLine(fs); } // ディレクトリ直下の「source」という文字をファイル名に含むファイルの一覧を取得する IEnumerable<string> patternFileSystems = Directory.EnumerateFileSystemEntries(path, "*source*"); foreach (string fs in patternFileSystems) { Console.WriteLine(fs); } // ディレクトリ以下のすべてのサブディレクトリを含むファイルの一覧を取得する IEnumerable<string> optionFileSystems = Directory.EnumerateFileSystemEntries(path, "*", SearchOption.AllDirectories); foreach (string fs in optionFileSystems) { Console.WriteLine(fs); } |
サンプルプログラム
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 |
using System; using System.Collections.Generic; using System.Windows.Forms; // System.IOのusingを追加 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // DirectoryInfoクラスのGetFileSystemInfosメソッドで検索パターンと検索オプションを指定してディレクトリとファイルを取得 private void button1_Click(object sender, EventArgs e) { try { // 対象のディレクトリのパス string path = textBox1.Text; // DirectoryInfoのインスタンスを生成 DirectoryInfo di = new DirectoryInfo(path); // 検索パターン string searchPattern = textBox2.Text; if (searchPattern == "") { searchPattern = "*"; } // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ファイルを取得 FileSystemInfo[] fileSystemInfos = di.GetFileSystemInfos(searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (FileSystemInfo fileSystemInfo in fileSystemInfos) { listBox1.Items.Add(fileSystemInfo.FullName); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryInfoクラスのEnumerateFileSystemInfosメソッドで検索パターンと検索オプションを指定してディレクトリとファイルを取得 private void button2_Click(object sender, EventArgs e) { try { // 対象のディレクトリのパス string path = textBox1.Text; // DirectoryInfoのインスタンスを生成 DirectoryInfo di = new DirectoryInfo(path); // 検索パターン string searchPattern = textBox2.Text; if (searchPattern == "") { searchPattern = "*"; } // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ファイルを取得 IEnumerable<FileSystemInfo> fileSystemInfos = di.EnumerateFileSystemInfos(searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (FileSystemInfo fileSystemInfo in fileSystemInfos) { listBox1.Items.Add(fileSystemInfo.FullName); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのGetFileSystemEntries静的メソッドで検索パターンと検索オプションを指定してディレクトリとファイルを取得 private void button3_Click(object sender, EventArgs e) { try { // 対象のディレクトリのパス string path = textBox1.Text; // 検索パターン string searchPattern = textBox2.Text; if (searchPattern == "") { searchPattern = "*"; } // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ファイルを取得 string[] fileSystems = Directory.GetFileSystemEntries(path, searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (string fileSystem in fileSystems) { listBox1.Items.Add(fileSystem); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのEnumerateFileSystemEntries静的メソッドで検索パターンと検索オプションを指定してディレクトリとファイルを取得 private void button4_Click(object sender, EventArgs e) { try { // 対象のディレクトリのパス string path = textBox1.Text; // 検索パターン string searchPattern = textBox2.Text; if (searchPattern == "") { searchPattern = "*"; } // 検索オプション SearchOption searchOption = SearchOption.TopDirectoryOnly; if (radioButton2.Checked) { searchOption = SearchOption.AllDirectories; } // ファイルを取得 IEnumerable<string> fileSystems = Directory.EnumerateFileSystemEntries(path, searchPattern, searchOption); // リストボックスに表示 listBox1.Items.Clear(); foreach (string fileSystem in fileSystems) { listBox1.Items.Add(fileSystem); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルの実行結果
上記のサンプルプログラムを実行すると、以下のように画面の条件に一致するディレクトリパスとファイルパスの一覧をリストボックスに表示します。
今回ご紹介したメソッドは、ディレクトリとファイルを一括して処理したい場合に重宝するメソッドです。
参考記事
ディレクトリ(フォルダー)の一覧を取得する方法については、以下の記事をご参照ください。
ファイルの一覧を取得する方法については、以下の記事をご参照ください。