フォルダ以下のファイルを最下層まで検索または取得する
スポンサーリンク
フォルダ内のすべてのファイルを取得する で紹介した 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); }
関連するリファレンス
準備中です。