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

スポンサーリンク

フォルダ内のすべてのファイルを取得する で紹介した 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

関連するリファレンス

準備中です。

スポンサーリンク