找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7022|回复: 4

[求助] 系统盘遍历查找指定文件名 如何得到绝对路径呢?

  [复制链接]

1

主题

9

回帖

0

精华

铜牌会员

积分
139
发表于 2010-2-15 22:15:50 | 显示全部楼层 |阅读模式
Public Const MAX_PATH = 260
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type
Public 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 * 14
End Type
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
'说明 根据文件名查找文件

'返回值 Long,如执行成功,返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄
'lpFileName String,欲搜索的文件名。可包含通配符,并可包含一个路径或相对路径名

'WIN32_FIND_DATA,这个结构用于装载与找到的文件有关的信息。该结构可用于后续的搜索
'由这个函数返回的句柄可以作为一个参数用于FindNextFile函数。这样一来,就可以方便的枚举出与lpFileName参数指定的文件名相符的所有文件
Public Declare Function FindNextFile Lib "kernel32" Alias _
        "FindNextFileA" (ByVal hFindFile As Long, _
        lpFindFileData As WIN32_FIND_DATA) As Long
        
Public Declare Function FindClose Lib "kernel32" (ByVal _
        hFindFile As Long) As Long
        
Public Declare Function SetCurrentDirectory Lib "kernel32" Alias _
        "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
Sub AllSearch(sPath As String, sFile As String)
    Dim xf As WIN32_FIND_DATA
    Dim ff As WIN32_FIND_DATA
    Dim findhandle As Long
    Dim lFindFile As Long
    Dim astr As String
    Dim bstr As String
   
    lFindFile = FindFirstFile(sPath + "\" + sFile, ff)
    'Debug.Print sPath + "\" + sFile
    If lFindFile > 0 Then
        Do
            Form1.List1.AddItem ff.cFileName
        Loop Until (FindNextFile(lFindFile, ff) = 0)
        FindClose lFindFile
    End If
    'Debug.Print Form1.List1.ListCount
   
    astr = sPath + "\" + "*.*"
    findhandle = FindFirstFile(astr, xf)
    DoEvents
    Do
        If xf.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY Then
            If Asc(xf.cFileName) <> Asc(".") Then
                bstr = sPath + "\" + Left$(xf.cFileName, InStr(xf.cFileName, Chr(0)) - 1)
                'Debug.Print bstr
                AllSearch bstr, sFile
               
                'lFindFile = FindFirstFile(bstr, ff)
                'Debug.Print bstr
                'Do
                '    Form1.List1.AddItem ff.cFileName
                    'Debug.Print ff.cFileName
                '    ff.cFileName = ""
                'Loop Until (FindNextFile(lFindFile, ff) = 0)
                'FindClose lFindFile
            End If
        End If
        xf.cFileName = ""
    Loop Until (FindNextFile(findhandle, xf) = 0)
    FindClose findfile
End Sub
模块的代码


    Dim SearchedPath As String
    Dim SearchedFile As String
   
    SearchedPath = InputBox("输入要搜索的路径" + Chr(13) + Chr(10) + "例如c:\windows")
    SearchedFile = InputBox("输入要搜索的文件名" + Chr(13) + Chr(10) + "例如*.exe abc.*")
    'FirstSearch = True
    AllSearch SearchedPath, SearchedFile
窗体的代码  


可以达到基本的要求

但是搜索到的文件 得到文件的绝对路径并执行删除操作呢?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-2-18 13:44:08 | 显示全部楼层
你这个一样是递归,但却没必要使用API,因为搜索速度的瓶颈在于硬盘的物理速度,而不主要是API调用的开销上,直接用DIR就行了.

全文件名,是路径加上文件名而成的,你增加一下即可.

或者,这里给你一个我写的模块,这个模块把所有找到的文件以全路径形式放在了一个动态数组中来返回,你只需要操作这个数组即可:

http://www.m5home.com/bbs/thread-2218-1-1.html

调用很简单:
  1. Sub Test()
  2.     '搜索文件模块测试过程
  3.     'BY 嗷嗷叫的老马
  4.     '紫水晶工作室
  5.     'http://www.m5home.com/
  6.     Dim I() As String, J As Long
  7.    
  8.     I = SearchFileInPath("c:\windows\web", "*.*")
  9.     For J = 0 To UBound(I)
  10.         Debug.Print I(J)   '打印所有文件
  11.     Next
  12. End Sub
复制代码
我就是嗷嗷叫的老马了......

76

主题

375

回帖

0

精华

铜牌会员

积分
231
发表于 2010-2-20 20:04:59 | 显示全部楼层
斑竹是傻逼,上紫水晶的都是傻逼。

1

主题

9

回帖

0

精华

铜牌会员

积分
139
 楼主| 发表于 2010-2-27 23:06:48 | 显示全部楼层
楼上的 为什么连自己也骂了?
难道 你连傻B 都不如?

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-2-28 02:29:23 | 显示全部楼层
他逻辑错误这么大,看来确实不是写程序的料
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表