| 
    
     |  | こんにちは よろしくお願いします 
 Application.FileSearch
 でのフォルダ、ファイルの検索が遅いので
 
 以前、高速なAPIで、フォルダ、ファイルの検索を教えて頂いた方法
 (セルやイミディエイトウインドウに出力)
 を、利用できないものかとチャレンジしましたがうまくいきません
 
 やりたいことは
 ファイルサーバーの所定のフォルダ配下には
 重複するファイル名が存在しないことになっているのですが
 時折、ファイルコピー等あったりして、キーで検索しても
 複数存在したり、無かったりするものがあります
 
 で、1ファイルだけの存在した場合場合、正常処理、そうでない場合は
 メッセージを出したいと考えています
 
 
 APIでの不具合の原因は、
 他書への出力の場合は問題はないのですが
 再帰のため戻り値や、配列に入れても最後の値しか取得できません
 
 戻り値や配列の値が1つであれば
 それを元に処理したいと考えています
 
 
 APIはコピペ程度でしか利用できないレベルです
 また、アプローチがおかしいような気もしています
 ご教授よろしくお願い致します
 
 
 下記は
 配列を公開で宣言してそこに値を貯めこもうと考えました
 
 
 Option Explicit
 Option Compare Text
 
 
 Private Type WIN32_FIND_DATAW
 dwFileAttributes As Long
 ftCreationTime(0 To 1) As Long
 ftLastAccessTime(0 To 1) As Long
 ftLastWriteTime(0 To 1) As Long
 nFileSizeHigh As Long
 nFileSizeLow As Long
 dwReserved0  As Long
 dwReserved1  As Long
 cFileName(0 To 519) As Byte
 cAlternateFileName(0 To 27) As Byte
 End Type
 Private Declare Function FindFirstFileW Lib "kernel32" _
 (lpFileName As Any, _
 lpFindFileData As WIN32_FIND_DATAW) As Long
 Private Declare Function FindNextFileW Lib "kernel32" _
 (ByVal hFindFile As Long, _
 lpFindFileData As WIN32_FIND_DATAW) As Long
 Private Declare Function FindClose Lib "kernel32" _
 (ByVal hFindFile As Long) As Long
 
 Dim HAIRETSU() As String
 
 
 ' ファイルの検索 (NT系OS専用)
 Sub SearchFiles3(ByVal strDir As String, strFind As String)
 
 Static wfd As WIN32_FIND_DATAW
 Dim strName As String
 Dim hFile As Long
 
 Dim I As Integer
 
 Dim TG_PATH As String
 
 I = 0
 TG_PATH = ""
 'GET_I = 0
 'GET_PATH = ""
 
 If StrComp(Right$(strDir, 1), "\", vbBinaryCompare) <> 0 Then
 strDir = strDir & "\"
 End If
 
 ' フォルダ(strDir)内の1件目を取得
 hFile = FindFirstFileW(ByVal StrPtr(strDir & "*"), wfd)
 If hFile = INVALID_HANDLE_VALUE Then
 ' この下の3行は消してもかまわない
 If Err.LastDllError = ERROR_CALL_NOT_IMPLEMENTED Then
 MsgBox "このOSでは動きません。", vbCritical
 End If
 Exit Sub
 End If
 
 Do
 ' ファイル(orフォルダ)名の取得
 strName = wfd.cFileName
 strName = Left$(strName, InStr(1, _
 strName, vbNullChar, vbBinaryCompare) - 1)
 
 'フォルダパス・ファイル部分一致
 If strName Like "*" & strFind & "*" Then
 '  Debug.Print strDir & strName
 TG_PATH = strDir & strName
 I = I + 1
 '  Debug.Print I
 
 ReDim HAIRETSU(I)
 HAIRETSU(I) = strDir & strName
 
 End If
 
 
 ' 属性の判定
 If wfd.dwFileAttributes And vbDirectory Then
 ' フォルダの場合
 If StrComp(strName, ".", vbBinaryCompare) <> 0 Then
 If StrComp(strName, "..", vbBinaryCompare) <> 0 Then
 ' 再帰呼び出し
 SearchFiles3 strDir & strName, strFind
 
 End If
 End If
 
 
 End If
 
 ' 引き続き2件目以降を取得 (全件取得するまでループ)
 Loop While FindNextFileW(hFile, wfd)
 
 ' ハンドルを閉じる
 FindClose hFile
 
 
 If I = 1 Then
 Debug.Print "正"
 Debug.Print TG_PATH
 
 ElseIf I > 1 Then
 Debug.Print "重複不整合"
 
 'ループ分実行されてしまう
 'Else
 'Debug.Print "無し"
 
 End If
 
 
 End Sub
 
 
 Public Sub test()
 
 
 Call SearchFiles3("\\hoge", "huga")
 
 
 Debug.Print HAIRETSU(1)
 Debug.Print UBound(HAIRETSU)
 
 
 End Sub
 
 
 |  |