目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
210 / 277 ←次へ | 前へ→

【76】FilePathを列挙するサンプル(API)
全般  ちゃっぴ  - 04/9/14(火) 1:37 -

引用なし
パスワード
   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)を
使用したほうがよいでしょう。

7,555 hits

【74】FilePathを列挙するサンプル ちゃっぴ 04/9/13(月) 23:57 全般[未読]
【75】Re:FilePathを列挙するサンプル ちゃっぴ 04/9/14(火) 0:03 全般[未読]
【76】FilePathを列挙するサンプル(API) ちゃっぴ 04/9/14(火) 1:37 全般[未読]
【77】Re:FilePathを列挙するサンプル(API) ちゃっぴ 04/9/14(火) 1:50 全般[未読]

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
210 / 277 ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free