|
Win32API FindFirstFile(A)を使ったサンプルです。
【EnumFilePathList3】をコールしてお使いください。
Const INVALID_HANDLE_VALUE As Long = (-1) '無効なFile Handle値
'ファイル属性
Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10 'フォルダ
Const MAX_PATH As Long = 260& 'パスの最大長
'WIN32_FIND_DATA構造体(ディレクトリエントリ(ファイル情報))
Private Type WIN32_FIND_DATA
dwFileAttributes As Long 'ファイル属性
ftCreationTime As Currency '作成日時
ftLastAccessTime As Currency '最終アクセス日時
ftLastWriteTime As Currency '最終更新日時
nFileSizeHigh As Long 'ファイルサイズの上位32bit値
nFileSizeLow As Long 'ファイルサイズの下位32bit値
dwReserved0 As Long '予約(現状なし)
dwReserved1 As Long '予約(現状なし)
cFileName As String * MAX_PATH 'ロングファイル名
cAlternate As String * 14 'ショートファイル名(8+3文字)
End Type
'-------------------------------------------------------------------------------------------
'[FindFirstFile] 文字列と一致するファイルを検索する
'
'戻り値 成功:検索ハンドル(Long)
' 失敗:INVALID_HANDLE_VALUE(-1)
'
'引数 lpFileName パス名文字列のポインタ(Long)
' lpFindFileData 検索結果([WIN32_FIND_DATA]構造体)
'-------------------------------------------------------------------------------------------
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
'-------------------------------------------------------------------------------------------
'[FindNextFile] [FindFirstFile]から継続してファイルを検索する
' (Unicode版)
'
'戻り値 成功:検索ハンドル(Long)
' 失敗:0
'
'引数 lpFileName パス名文字列のポインタ(Long)
' lpFindFileData 検索結果([WIN32_FIND_DATA]構造体)
'-------------------------------------------------------------------------------------------
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileW" _
(ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long
'-------------------------------------------------------------------------------------------
'[FindClose] [FindFirstFile]ハンドルをクローズする
'
'戻り値 0:失敗, 0以外:成功
'
'引数 hFindFile 対象検索ハンドル(Long)
'-------------------------------------------------------------------------------------------
Private Declare Function FindClose Lib "kernel32" _
(ByVal hFindFile As Long) As Long
'*******************************************************************************************
'[EnumFilePathList3]
'
'引数 strSearchPath 検索対象パス名(String)
' strSearchBaseName 検索対象ファイル名(String)
' strSearchExtention 検索対象拡張子(String)
'*******************************************************************************************
Sub EnumFilePathList3(ByVal strSearchPath As String, _
Optional ByVal strSearchBaseName As String = "*", _
Optional ByVal strSearchExtention As String = "*")
Dim udtWin32FindData As WIN32_FIND_DATA '[WIN32_FIND_DATA]構造体(検索結果)
Dim lngFindFileHandle As Long '[FindFirstFile]のハンドル
Dim strFindFileName As String '検索結果ファイル名
Dim lngResultCode As Long 'APIのエラーコード
'検索フルパス名を生成
strSeachFullPath = strSearchPath _
& "\" & strSearchBaseName & "." & strSearchExtention
'文字列に一致するファイルを検索し、WIN32_FIND_DATA構造体に値を代入
lngFindFileHandle = FindFirstFile(strSeachFullPath, udtWin32FindData)
'検索結果ファイルハンドルが無効な場合終了
If lngFindFileHandle <> INVALID_HANDLE_VALUE Then
Do
'ファイル名からNull文字を削除し格納
strFindFileName = udtWin32FindData.cFileName
strFindFileName = Left$(strFindFileName, InStr(strFindFileName, vbNullChar) - 1)
'ファイル名が現在のフォルダ"."及び上位フォルダ".."でない場合
If strFindFileName <> "." And strFindFileName <> ".." Then
'ファイルの属性がディレクトリの場合
If udtWin32FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY Then
'サブフォルダを検索(再帰呼び出し)
Call EnumFilePathList4(strSearchPath & "\" & strFindFileName, _
strSearchBaseName, strSearchExtention)
Else
Debug.Print strSearchPath & "\" & strFindFileName
End If
End If
' 継続してファイルを検索
Loop Until FindNextFile(lngFindFileHandle, udtWin32FindData) = 0
End If
'ファイルハンドルをクローズ
lngResultCode = FindClose(lngFindFileHandle)
End Sub
難易度はかなり高めですが、速度は驚きです。
DIRコマンドと同じくファイル名にワイルドカードを使用して、
フィルタリングすることが可能です。
ただ、ANSI版ですので、パス名にUnicode拡張文字が使用されていた場合、
エラーになります。
NT系のOSを使用している場合には、後述のFindFirstFile(W)を
使用したほうがよいでしょう。
|
|