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