用胜利API文件路径递归搜索 [英] Recursive Search for file paths using win API

查看:173
本文介绍了用胜利API文件路径递归搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从这里以下code <一个href=\"http://stackoverflow.com/questions/30511217/optimize-speed-of-recursive-file-search-in-subdirectories\">Optimize递归文件搜索速度

我在字典中添加code的一条线,以它来存储文件名

问题/
我怎么能保存文件路径,而不是字典中的文件名,你能不能帮我请。

 显式的选项私人声明PTRSAFE功能FindClose库KERNEL32(BYVAL hFindFile作为LongPtr)只要
私人声明PTRSAFE功能FindFirstFileW库KERNEL32(BYVAL lpFileName的对象作为LongPtr,BYVAL lpFindFileData作为LongPtr)由于LongPtr
私人声明PTRSAFE功能FindNextFileW库KERNEL32(BYVAL hFindFile作为LongPtr,BYVAL lpFindFileData作为LongPtr)由于LongPtr私人类型FILETIME
    dwLowDateTime只要
    dwHighDateTime只要
结束类型常量MAX_PATH只要= 260
常量ALTERNATE只要= 14可与W或一个函数中使用
通VarPtr(WFD)到W或干脆WFD至A
私人WIN32_FIND_DATA型
    dwFileAttributes只要
    ftCreationTime由于FILETIME
    ftLastAccessTime由于FILETIME
    ftLastWriteTime由于FILETIME
    nFileSizeHigh只要
    nFileSizeLow只要
    dwReserved0只要
    dwReserved1只要
    cFileName作为字符串* MAX_PATH
    cAlternate作为字符串*备用
结束类型私人常量INVALID_HANDLE_VALUE作为LongPtr = -1

---------------------------------------------- ---------------

 子测试()
        昏暗HFILE作为LongPtr
        昏暗sFileName作为字符串
        DIM WFD由于WIN32_FIND_DATA
        昏暗的字典作为对象
        昏暗的K作为龙
        昏暗的开始,结束为Variant
        设置字典=的CreateObject(的Scripting.Dictionary)        sFileName =C:\\用户\\管理\\桌面\\桌面 - \\读\\ *。docx文档。能容纳32,767个字符        HFILE = FindFirstFileW(StrPtr(sFileName),VarPtr(WFD))
        启动定时器=
        如果HFILE&LT;&GT; INVALID_HANDLE_VALUE然后
            做虽然FindNextFileW(HFILE,VarPtr(WFD))                dict.Add键:= K,货号:=左$(wfd.cFileName,INSTR(wfd.cFileName,vbNullChar) - 1)
                K = K + 1
            循环            FindClose HFILE
        万一
        完成=定时器
        Debug.Print完成 - 启动


解决方案

 子测试()
        昏暗HFILE作为LongPtr
        昏暗sFileName作为字符串
        DIM WFD由于WIN32_FIND_DATA
        昏暗的字典作为对象
        昏暗的K作为龙
        昏暗sFolder作为字符串'&LT;&LT;&LT;        设置字典=的CreateObject(的Scripting.Dictionary)        sFolder =C:\\用户\\管理\\桌面\\桌面 - \\读\\'&LT;&LT;&LT;
        sFileName = sFolder&安培; *的.docx'能容纳32,767个字符        HFILE = FindFirstFileW(StrPtr(sFileName),VarPtr(WFD))        如果HFILE&LT;&GT; INVALID_HANDLE_VALUE然后
            做虽然FindNextFileW(HFILE,VarPtr(WFD))                dict.Add键:= K,货号:= sFolder&安培; _
                         左$(wfd.cFileName,INSTR(wfd.cFileName,vbNullChar) - 1)'&所述;&所述;&下;
                K = K + 1
            循环            FindClose HFILE
        万一
结束小组

I got the below code from here Optimize Speed of Recursive File Search

i added one line of code to it to store file names in a dictionary

Question/ how can I store the file paths instead of file names in the dictionary, could you help me please.

Option Explicit

Private Declare PtrSafe Function FindClose Lib "kernel32" (ByVal hFindFile As LongPtr) As Long
Private Declare PtrSafe Function FindFirstFileW Lib "kernel32" (ByVal lpFileName As LongPtr, ByVal lpFindFileData As LongPtr) As LongPtr
Private Declare PtrSafe Function FindNextFileW Lib "kernel32" (ByVal hFindFile As LongPtr, ByVal lpFindFileData As LongPtr) As LongPtr

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Const MAX_PATH As Long = 260
Const ALTERNATE As Long = 14

' Can be used with either W or A functions
' Pass VarPtr(wfd) to W or simply wfd to A
Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * ALTERNATE
End Type

Private Const INVALID_HANDLE_VALUE As LongPtr = -1

'-------------------------------------------------------------

Sub test()
        Dim hFile As LongPtr
        Dim sFileName As String
        Dim wfd As WIN32_FIND_DATA
        Dim dict As Object
        Dim k As Long
        Dim Start, finish As Variant
        Set dict = CreateObject("Scripting.Dictionary")

        sFileName = "C:\Users\Administrator\Desktop\desktop-\read\*.docx"    ' Can be up to 32,767 chars

        hFile = FindFirstFileW(StrPtr(sFileName), VarPtr(wfd))
        Start = Timer
        If hFile <> INVALID_HANDLE_VALUE Then
            Do While FindNextFileW(hFile, VarPtr(wfd))

                dict.Add Key:=k, Item:=Left$(wfd.cFileName, InStr(wfd.cFileName, vbNullChar) - 1)
                k = k + 1
            Loop

            FindClose hFile
        End If
        finish = Timer
        Debug.Print finish - Start

解决方案

Sub test()
        Dim hFile As LongPtr
        Dim sFileName As String
        Dim wfd As WIN32_FIND_DATA
        Dim dict As Object
        Dim k As Long
        Dim sFolder As String'<<<

        Set dict = CreateObject("Scripting.Dictionary")

        sFolder = "C:\Users\Administrator\Desktop\desktop-\read\" '<<<
        sFileName = sFolder & "*.docx"    ' Can be up to 32,767 chars

        hFile = FindFirstFileW(StrPtr(sFileName), VarPtr(wfd))

        If hFile <> INVALID_HANDLE_VALUE Then
            Do While FindNextFileW(hFile, VarPtr(wfd))

                dict.Add Key:=k, Item:=sFolder & _
                         Left$(wfd.cFileName, InStr(wfd.cFileName, vbNullChar) - 1) '<<<
                k = k + 1
            Loop

            FindClose hFile
        End If
End Sub    

这篇关于用胜利API文件路径递归搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆