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

スポンサーリンク

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

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

サンプルコード

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

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

    // このディレクトリ内のすべてのファイルを検索する
    final String[] stFilePathes = System.IO.Directory.GetFiles(stRootPath, stPattern);
    for (int i = 0; i <= stFilePathes.length - 1; i++) {
        hStringCollection.Add(stFilePathes[i]);
    }

    // このディレクトリ内のすべてのサブディレクトリを検索する (再帰)
    final String[] stDirPathes = System.IO.Directory.GetDirectories(stRootPath);
    for (int i = 0; i <= stDirPathes.length - 1; i++) {
        final String[] stPathes = GetFilesMostDeep(stDirPathes[i], stPattern);

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

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

    return stReturns;
}

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

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

    // 取得したファイル名を列挙する
    for (int i = 0; i <= stFilePathes.length - 1; i++) {
        stPrompt += stFilePathes[i] + System.Environment.get_NewLine();
    }

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

関連するリファレンス

準備中です。

スポンサーリンク