[C# Directory] フォルダ内のファイル名一覧を取得する(EnumerateFiles)

System.IO.Directory.EnumerateFilesメソッドを使うと指定したフォルダ内にあるファイルの一覧を取得することができます。

System.IO.Directory.GetFilesメソッドでも同じことができますが、GetFilesの場合はフォルダ内のファイルをすべて検索してから戻り値を返すのに対し、EnumerateFilesメソッドファイルが見つかると一旦呼び出し元に処理が戻ってきます

これの何がいいのか?と言うと、フォルダ内にファイルが大量にあり検索に時間がかかる時にGetFilesを使うとすべてのファイルを検索してから処理が呼び出し元に返ってくるため検索中は処理が止まったように見えます。EnumerateFilesメソッドの場合はファイルが見つかると一旦処理が返ってくるため、待機時間が短くなります。

GetFilesメソッドを使ったファイル一覧の取得方法については、
フォルダ内のファイル名一覧を取得する(GetFiles)を見てください。

スポンサーリンク

フォルダ内にあるファイル一覧を取得する

フォルダ内にあるファイル一覧を取得するには、
System.IO.Directory.EnumerateFilesメソッドの引数に検索するフォルダのパスを指定します。戻り値はファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。引数を1つだけ指定した場合は、フォルダ内にあるファイルのみが検索対象になります。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内のファイル名一覧を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath)) {
            Console.WriteLine(file);
        }
    }
}

こんな感じで各ファイルの絶対パスが返ってきます。

D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs
D:\source\repos\test\test\test.csproj
スポンサーリンク

ワイルドカードを使い取得するファイルを絞る

EnumerateFilesメソッドの第2引数にワイルドカードを使った検索パターンを指定することが出来ます。

第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。

全てのファイルを対象にする場合「*」、
拡張子を指定する場合、「*.txt」、「*.cs」のように指定します。

戻り値は同じくファイルのパスが入ったstringの列挙可能型(IEnumerable<string>)です。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内からソースファイル(*.cs)を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*.cs")) {
            Console.WriteLine(file);
        }
    }
}

出力結果はこんな感じでcsファイルだけ取得することが出来ます。

D:\source\repos\test\test\Class1.cs
D:\source\repos\test\test\Program.cs
スポンサーリンク

フォルダ内のサブフォルダを含めてファイルを検索する

EnumerateFilesメソッドの第3引数に検索オプション(指定フォルダ内のみ、サブフォルダも検索対象にする)を指定することが出来ます。

第1引数には検索するフォルダのパスを指定します。
第2引数にはワイルドカードを使った検索パターンを指定します。
第3引数に検索オプション(System.IO.SearchOption)を指定します。

検索オプションは以下の2つから選択します。
SearchOption.AllDirectories : 指定されたフォルダとサブフォルダ内のファイルが対象
SearchOption.TopDirectoryOnly: 指定されたフォルダ内のファイルが対象

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 指定したフォルダ内からソースファイル(*.cs)を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)) {
            Console.WriteLine(file);
        }
    }
}

出力結果は長いので省略します。

EnumerationOptionsを指定してサブフォルダを検索対象にする

EnumerateFilesメソッドの第3引数にEnumerationOptionsクラスを指定してサブフォルダを検索することもできます。

第3引数にあらかじめRecurseSubdirectoriesプロパティtrueを設定したEnumerationOptionsクラスのインスタンスを渡します。

using System;
using System.IO;
class Program
{
    public static void Main()
    {
        // フォルダのパス
        var dirPath = @"D:\source\repos\test\test";

        // 検索オプションの設定
        var op = new EnumerationOptions { 
            // サブフォルダも対象にする
            RecurseSubdirectories = true,
        };

        // 指定したフォルダとサブフォルダ内からファイル一覧を取得する
        foreach (string file in Directory.EnumerateFiles(dirPath, "*", op)) {
            Console.WriteLine(file);
        }
    }
}

他のEnumerationOptionsクラスのプロパティは以下になります。

プロパティ説明規定値
AttributesToSkipスキップするファイルの属性を指定しますHidden | System
隠しファイルとシステムファイルはスキップ
BufferSize推奨されるバッファーサイズを指定します0
Ignorelnaccessibleファイルにアクセス拒否された場合にスキップするかを指定しますtrue
MatchCasing大文字と小文字の区別をどうするかSystem.IO.MatchCasing.PlatformDefault
プラットフォームに依存する
MatchType使用するワイルドカードの種類を指定するSystem.IO.MatchType.Simple
*と?をワイルドカードとして使用
RecurseSubdirectoriesサブフォルダを対象にするかを指定するfalse
しない
ReturnSpecialDirectories特殊なディレクトリ「.」「..」を取得するかを指定するfalse
しない

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました