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

スポンサーリンク

VB6 では、FileSystemObject (FSO) から Folder オブジェクトを取得して、Files コレクションで列挙します。SubFolders コレクションは自身を再帰呼び出しすることで対応します。

String の配列と ReDim Preserve を使うことになりますが、String はオブジェクト型でないため、Nothing などが格納できません。(空文字で初期値される)要素が 1 つも確保されていない場合は UBound 関数でエラーになるため、初めに 1 つだけ確保しています。要素の最大値が 1 以上である場合は格納されているものとし、要素の最大値が 0 の場合は格納されていないものとします。

FileSystemObject を使用する場合は、[プロジェクト] メニューの [参照設定] を選択して「Microsoft Scripting Runtime」にチェックを付けてください。

サンプルコード

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

VB6.0 以前
' -------------------------------------------------------------------------------
'       指定した検索パターンに一致するファイルを最下層まで検索しすべて返します。
'
' @Param    stRootPath  検索を開始する最上層のディレクトリへのパス。
' @Param    stPattern   パス内のファイル名と対応させる検索文字列。
' @Return               検索パターンに一致したすべてのファイルパス。
'                       取得できなかった場合は要素の最大値は 0 である。
' -------------------------------------------------------------------------------
Public Function GetFilesMostDeep(ByVal stRootPath As String, ByVal stPattern As String) As String()
    Dim stReturns() As String

    ' 0 の要素だけ確保しておく (Nothing が使えないため)
    ReDim stReturns(0)

    ' 検索文字列をすべて大文字にする (Like 演算子が大文字・小文字を区別するため)
    stPattern = LCase$(stPattern)

    ' FileSystemObject (FSO) の新しいインスタンスを生成する
    Dim cFso As FileSystemObject
    Set cFso = New FileSystemObject

    ' Folder オブジェクトを取得する
    Dim cRootFolder As Folder
    Set cRootFolder = cFso.GetFolder(stRootPath)

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFso = Nothing

    Dim lIndex As Long
    Dim cFile  As File

    ' このディレクトリ内のすべてのファイルを検索する
    For Each cFile In cRootFolder.Files
        If LCase$(cFile.Name) Like stPattern Then
            lIndex = lIndex + 1
            ReDim Preserve stReturns(lIndex)
            stReturns(lIndex) = cFile.Path
        End If
    Next cFile

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFile = Nothing

    Dim cSubFolder As Folder

    ' このディレクトリ内のすべてのサブディレクトリを検索する (再帰)
    For Each cSubFolder In cRootFolder.SubFolders
        Dim stFilePathes() As String
        stFilePathes() = GetFilesMostDeep(cSubFolder.Path, stPattern)

        ' ファイルが格納されている要素数を取得する
        Dim lBounds As Long
        lBounds = UBound(stFilePathes())

        ' 要素数が 1 以上ならば再帰元の配列へコピーする
        If lBounds >= 1 Then
            ReDim Preserve stReturns(lIndex + lBounds)

            Dim lCopy As Long
            For lCopy = 1 To lBounds
                stReturns(lIndex + lCopy) = stFilePathes(lCopy)
            Next lCopy

            lIndex = lIndex + lBounds
        End If
    Next cSubFolder

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cRootFolder = Nothing
    Set cSubFolder  = Nothing

    ' 取得したすべてのファイルを返す
    GetFilesMostDeep = stReturns()
End Function

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

VB6.0 以前
    ' 必要な変数を宣言する
    Dim stFilePathes() As String

    ' ファイル名に「Hoge」を含み、拡張子が「.txt」のファイルを最下層まで検索し取得する
    stFilePathes() = GetFilesMostDeep("C:\Hoge\", "*Hoge*.txt")

    Dim lIndex   As Long
    Dim stPrompt As String

    ' 取得したファイル名を列挙する (※ 添字が 1 からであることに注意)
    For lIndex = 1 To UBound(stFilePathes())
        stPrompt = stPrompt & stFilePathes(lIndex) & vbNewLine
    Next lIndex

    ' 取得したすべてのファイルパスを表示する
    If stPrompt <> "" Then
        Call MsgBox(stPrompt)
    End If

関連するリファレンス

準備中です。

スポンサーリンク