|
Win32API FindFirstFile(W)を使ったサンプルです。
【EnumFilePathList4】をコールしてお使いください。
Const INVALID_HANDLE_VALUE As Long = (-1) '無効なFile Handle値
'ファイル属性
Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10 'フォルダ
Const MAX_PATH As Long = 260& 'パスの最大長
Const conUnicodeMaxPath As Long = MAX_PATH * 2 - 1 'Unicodeでのパス最大長
'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(MAX_PATH * 2 - 1) As Byte 'ロングファイル名
cAlternate(14 * 2 - 1) As Byte 'ショートファイル名(8+3文字)
End Type
'-------------------------------------------------------------------------------------------
'[FindFirstFile] 文字列と一致するファイルを検索する
' (Unicode版)
'
'戻り値 成功:検索ハンドル(Long)
' 失敗:INVALID_HANDLE_VALUE(-1)
'
'引数 lpFileName パス名文字列のポインタ(Long)
' lpFindFileData 検索結果([WIN32_FIND_DATA]構造体)
'-------------------------------------------------------------------------------------------
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" _
(ByVal lpFileName As Long, _
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
'*******************************************************************************************
'[EnumFilePathList4]
'
'引数 strSearchPath 検索対象パス名(String)
' strSearchBaseName 検索対象ファイル名(String)
' strSearchExtention 検索対象拡張子(String)
'*******************************************************************************************
Sub EnumFilePathList4(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 = IIf(strSearchPath Like "\\*", "\\?\UNC" & _
Mid$(strSearchPath, 2), "\\?\" & strSearchPath) _
& "\" & strSearchBaseName & "." & strSearchExtention
'文字列に一致するファイルを検索し、WIN32_FIND_DATA構造体に値を代入
lngFindFileHandle = FindFirstFile(StrPtr(strSeachFullPath), udtWin32FindData)
'検索結果ファイルハンドルが無効な場合終了
If lngFindFileHandle <> INVALID_HANDLE_VALUE Then
Do
'ファイル名からNull文字を削除し格納
strFindFileName = CStr(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 While FindNextFile(lngFindFileHandle, udtWin32FindData)
End If
'ファイルハンドルをクローズ
lngResultCode = FindClose(lngFindFileHandle)
End Sub
Unicode版FindFirstFileを使用したサンプルです。
Unicode版なのでWindows2000以降限定です。
速度に関しては言うまでもありません。
これが使えこなせれば、いうことはないでしょう。
他にもDir関数、FileSearchオブジェクト等ファイル検索するものは
ありますが、問題があるため推奨しません。
|
|