フォルダ以下のファイルを最下層まで検索または取得する
スポンサーリンク
フォルダ内のすべてのファイルを取得する で紹介した System.IO.Directory クラスの GetFiles メソッドは、ディレクトリ内のファイルはすべて取得できますが、サブディレクトリ内のファイルまでは検索しません。サブディレクトリ内のファイルまで対象にするには、再帰呼び出しを使って再帰的に検索する必要があります。この方法を用いれば、あるパターンに合致したファイルを検索したり、あるパターンに合致したファイルをすべて取得可能です。
以下は、その処理を関数化したものです。ファイルの検索をやめて、ディレクトリを列挙するように変更することで、ディレクトリの検索も可能です。
サンプルコード
以下にサンプルコードを示します。
VB.NET 全般
''' --------------------------------------------------------------------------------------- ''' <summary> ''' 指定した検索パターンに一致するファイルを最下層まで検索しすべて返します。</summary> ''' <param name="stRootPath"> ''' 検索を開始する最上層のディレクトリへのパス。</param> ''' <param name="stPattern"> ''' パス内のファイル名と対応させる検索文字列。</param> ''' <returns> ''' 検索パターンに一致したすべてのファイルパス。</returns> ''' --------------------------------------------------------------------------------------- Public Shared Function GetFilesMostDeep(ByVal stRootPath As String, ByVal stPattern As String) As String() Dim hStringCollection As New System.Collections.Specialized.StringCollection() ' このディレクトリ内のすべてのファイルを検索する For Each stFilePath As String In System.IO.Directory.GetFiles(stRootPath, stPattern) hStringCollection.Add(stFilePath) Next stFilePath ' このディレクトリ内のすべてのサブディレクトリを検索する (再帰) For Each stDirPath As String In System.IO.Directory.GetDirectories(stRootPath) Dim stFilePathes As String() = GetFilesMostDeep(stDirPath, stPattern) ' 条件に合致したファイルがあった場合は、ArrayList に加える If Not stFilePathes Is Nothing Then hStringCollection.AddRange(stFilePathes) End If Next stDirPath ' StringCollection を 1 次元の String 配列にして返す Dim stReturns As String() = New String(hStringCollection.Count - 1) {} hStringCollection.CopyTo(stReturns, 0) Return stReturns End Function
使用例は以下のようになります。
VB.NET 全般
' ファイル名に「Hoge」を含み、拡張子が「.txt」のファイルを最下層まで検索し取得する Dim stFilePathes As String() = GetFilesMostDeep("C:\Hoge\", "*Hoge*.txt") Dim stPrompt As String = String.Empty ' 取得したファイル名を列挙する For Each stFilePath As String In stFilePathes stPrompt &= stFilePath & System.Environment.NewLine Next stFilePath ' 取得したすべてのファイルパスを表示する If stPrompt <> String.Empty Then MessageBox.Show(stPrompt) End If
関連するリファレンス
準備中です。