C#フォルダ以下のファイルを最下層まで検索または取得する

スポンサーリンク

フォルダ内のすべてのファイルを取得する で紹介した System.IO.Directory クラスの GetFiles メソッドは、ディレクトリ内のファイルはすべて取得できますが、サブディレクトリ内のファイルまでは検索しません。サブディレクトリ内のファイルまで対象にするには、再帰呼び出しを使って再帰的に検索する必要があります。この方法を用いれば、あるパターンに合致したファイルを検索したり、あるパターンに合致したファイルをすべて取得可能です。

以下は、その処理を関数化したものです。ファイルの検索をやめて、ディレクトリを列挙するように変更することで、ディレクトリの検索も可能です。

サンプルコード

以下にサンプルコードを示します。

C# 全般
/// ---------------------------------------------------------------------------------------
/// <summary>
///     指定した検索パターンに一致するファイルを最下層まで検索しすべて返します。</summary>
/// <param name="stRootPath">
///     検索を開始する最上層のディレクトリへのパス。</param>
/// <param name="stPattern">
///     パス内のファイル名と対応させる検索文字列。</param>
/// <returns>
///     検索パターンに一致したすべてのファイルパス。</returns>
/// ---------------------------------------------------------------------------------------
public static string[] GetFilesMostDeep(string stRootPath, string stPattern) {
    System.Collections.Specialized.StringCollection hStringCollection = (
        new System.Collections.Specialized.StringCollection()
    );

    // このディレクトリ内のすべてのファイルを検索する
    foreach (string stFilePath in System.IO.Directory.GetFiles(stRootPath, stPattern)) {
        hStringCollection.Add(stFilePath);
    }

    // このディレクトリ内のすべてのサブディレクトリを検索する (再帰)
    foreach (string stDirPath in System.IO.Directory.GetDirectories(stRootPath)) {
        string[] stFilePathes = GetFilesMostDeep(stDirPath, stPattern);

        // 条件に合致したファイルがあった場合は、ArrayList に加える
        if (stFilePathes != null) {
            hStringCollection.AddRange(stFilePathes);
        }
    }

    // StringCollection を 1 次元の String 配列にして返す
    string[] stReturns = new string[hStringCollection.Count];
    hStringCollection.CopyTo(stReturns, 0);

    return stReturns;
}

使用例は以下のようになります。

C# 全般
    // ファイル名に「Hoge」を含み、拡張子が「.txt」のファイルを最下層まで検索し取得する
    string[] stFilePathes = GetFilesMostDeep(@"C:\Hoge\", "*Hoge*.txt");
    string   stPrompt = string.Empty;

    // 取得したファイル名を列挙する
    foreach (string stFilePath in stFilePathes) {
        stPrompt += stFilePath + System.Environment.NewLine;
    }

    // 取得したすべてのファイルパスを表示する
    if (stPrompt != string.Empty) {
        MessageBox.Show(stPrompt);
    }

関連するリファレンス

準備中です。

スポンサーリンク