怎样用VB实现 在硬盘搜索一个文件

解决方案 »

  1.   

    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End TypePrivate 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
    '过滤空格
    Function StripNulls(OriginalStr As String) As String
        If (InStr(OriginalStr, Chr(0)) > 0) Then
            OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
        End If
        StripNulls = OriginalStr
    End FunctionFunction FindFilesAPI(path As String, SearchStr As String)
        Dim FileName As String
        Dim DirName As String
        Dim dirNames() As String
        Dim nDir As Integer
        Dim i As Integer
        Dim hSearch As Long
        Dim WFD As WIN32_FIND_DATA
        Dim Cont As Integer
        If Right(path, 1) <> "\" Then path = path & "\"
        
        '使用dirname()纪录所有的子目录
        nDir = 0
        ReDim dirNames(nDir)
        Cont = True
        hSearch = FindFirstFile(path & "*.*", WFD)
        
        If hSearch <> INVALID_HANDLE_VALUE Then
           
           Do While Cont
            DirName = StripNulls(WFD.cFileName)
            If (DirName <> ".") And (DirName <> "..") Then
                If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                    dirNames(nDir) = DirName
                    nDir = nDir + 1
                    ReDim Preserve dirNames(nDir)
                End If
            End If
            Cont = FindNextFile(hSearch, WFD)
            DoEvents
            Loop
            
            Cont = FindClose(hSearch)
        End If
        
        '然后开始指定文件的查找
        hSearch = FindFirstFile(path & SearchStr, WFD)
        Cont = True
        If hSearch <> INVALID_HANDLE_VALUE Then
            While Cont
                FileName = StripNulls(WFD.cFileName)
                If (FileName <> ".") And (FileName <> "..") Then
                    '加入文件
                    List1.AddItem path & FileName
                End If
                '得到下一个文件
                Cont = FindNextFile(hSearch, WFD)
                DoEvents
            Wend
            Cont = FindClose(hSearch)
        End If
        
        ' 查找子目录
        If nDir > 0 Then
            For i = 0 To nDir - 1
                FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr)
            Next i
        End If
        
    End FunctionSub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = "c:\"
        FindStr = "*.exe"
        FindFilesAPI SearchPath, FindStr
        Screen.MousePointer = vbDefault
    End Sub使用api在硬盘上搜索exe文件
      

  2.   

    我现在搜索到  一 个123.exe
    我现在怎么删除它啊??
      

  3.   

    Kill 语句
          从磁盘中删除文件。语法Kill pathname必要的 pathname 参数是用来指定一个文件名的字符串表达式。pathname 可以包含目录或文件夹、以及驱动器。说明在 Microsoft Windows 中,Kill 支持多字符 (*) 和单字符 (?) 的统配符来指定多重文件。最简单的
    还可以使用api,fso
      

  4.   

    Dim fso
    Dim fn As StringPrivate Sub Command1_Click()
    Dim fd As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    fd = "C:\"
    Call getFilenm(fd)
    MsgBox "OK"
    End SubFunction getFilenm(fdnm As String)
    Dim obFd, fl, sfd
    DoEvents
    Me.Label1.Caption = fdnm
    Set obFd = fso.GetFolder(fdnm)
      For Each fl In obFd.Files
      DoEvents
         If fl.Name = "setup.exe" Then
          Debug.Print fdnm & "\" & fl.Name
         End If
      Next
    If obFd.SubFolders.Count > 0 Then
      For Each sfd In obFd.SubFolders
        Call getFilenm(sfd.Path)
      Next
    End If
    End Function
      

  5.   

    fso简单一些
    Option ExplicitDim fso
    Dim fn As String
    Dim SFlag As Boolean
    Private Sub Command1_Click()
    Dim fd As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    List1.Clear
    SFlag = True
    fd = "C:"
    Call getFilenm(fd)
    MsgBox "OK"
    End SubFunction getFilenm(fdnm As String)
    Dim obFd, fl, sfd
    DoEvents
    Me.Label1.Caption = fdnm
    Set obFd = fso.GetFolder(fdnm)
      For Each fl In obFd.Files
      DoEvents
      
      '  是否停止
      If SFlag = False Then
         Exit Function
      End If
         'If fl.Name = "setup.exe" Then
      List1.AddItem fdnm & "\" & fl.Name
         'End If
      Next
      
        
    If obFd.SubFolders.Count > 0 Then
      For Each sfd In obFd.SubFolders
        Call getFilenm(sfd.Path)
      Next
    End If
    End FunctionPrivate Sub Command2_Click()
    SFlag = False
    End Sub
      

  6.   

    Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
    Const MAX_PATH = 260
    Const MAXDWORD = &HFFFF
    Const INVALID_HANDLE_VALUE = -1
    Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Const FILE_ATTRIBUTE_HIDDEN = &H2
    Const FILE_ATTRIBUTE_NORMAL = &H80
    Const FILE_ATTRIBUTE_READONLY = &H1
    Const FILE_ATTRIBUTE_SYSTEM = &H4
    Const FILE_ATTRIBUTE_TEMPORARY = &H100Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End TypePrivate 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
    '过滤空格
    Function StripNulls(OriginalStr As String) As String
        If (InStr(OriginalStr, Chr(0)) > 0) Then
            OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
        End If
        StripNulls = OriginalStr
    End FunctionFunction FindFilesAPI(path As String, SearchStr As String)
        Dim FileName As String
        Dim DirName As String
        Dim dirNames() As String
        Dim nDir As Integer
        Dim i As Integer
        Dim hSearch As Long
        Dim WFD As WIN32_FIND_DATA
        Dim Cont As Integer
        If Right(path, 1) <> "\" Then path = path & "\"
        
        '使用dirname()纪录所有的子目录
        nDir = 0
        ReDim dirNames(nDir)
        Cont = True
        hSearch = FindFirstFile(path & "*.*", WFD)
        
        If hSearch <> INVALID_HANDLE_VALUE Then
           
           Do While Cont
            DirName = StripNulls(WFD.cFileName)
            If (DirName <> ".") And (DirName <> "..") Then
                If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                    dirNames(nDir) = DirName
                    nDir = nDir + 1
                    ReDim Preserve dirNames(nDir)
                End If
            End If
            Cont = FindNextFile(hSearch, WFD)
            DoEvents
            Loop
            
            Cont = FindClose(hSearch)
        End If
        
        '然后开始指定文件的查找
        hSearch = FindFirstFile(path & SearchStr, WFD)
        Cont = True
        If hSearch <> INVALID_HANDLE_VALUE Then
            While Cont
                FileName = StripNulls(WFD.cFileName)
                If (FileName <> ".") And (FileName <> "..") Then
                    '加入文件
                    List1.AddItem path & FileName
                End If
                '得到下一个文件
                Cont = FindNextFile(hSearch, WFD)
                DoEvents
            Wend
            Cont = FindClose(hSearch)
        End If
        
        ' 查找子目录
        If nDir > 0 Then
            For i = 0 To nDir - 1
                FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr)
            Next i
        End If
        
    End FunctionSub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = "c:\"
        FindStr = "*.exe"
        FindFilesAPI SearchPath, FindStr
        Screen.MousePointer = vbDefault
    End Sub在这里面怎么停止搜索啊????
      

  7.   

    Dim sflag As Boolean
    '在FindFilesAPI汉书中找到下面的,增加
    If (FileName <> ".") And (FileName <> "..") Then
                    '这是新增的
                    '加入文件
                      If sflag = False Then
                           Exit Function
                      End If
      
                    List1.AddItem path & FileName
                End IfPrivate Sub Command2_Click()
    sflag = False
    Screen.MousePointer = vbDefault
    End Sub
      

  8.   

    忘贴了
    这里初始化以下
    Sub Command1_Click()
    ...
        sflag = True
    ...
    End Sub
      

  9.   

    我在搜索的时候 如果我要删除123.exe  我就用这Kill "C:\123.exe"
    那么在 "C:\WINDOWS\123.exe" 它就删除不掉了(只能查到) 除非你改路径 kill  "C:\WINDOWS\123.exe" 
    我想有什么办法只知道它的文件名就可以删除它
      

  10.   

    还是不行啊
    sflag = True
    好像是在那个函数里面起作用
    一出去就不行了
      

  11.   

    增加一个按钮,删除找到的
    Private Sub Command3_Click()
    Dim i As Integer
    For i = 0 To List1.ListCount - 1
    Kill List1.List(i)
    Next
    End Sub一出去就不行了?事么意思?
    仔细测试,我这边都试过了
      

  12.   

    Private Sub Command3_Click()
    Dim i As Integer
    For i = 0 To List1.ListCount - 1
    Kill List1.List(i)
    Next
    End Sub找不到文件
    如果可以的话你把你的发给我
    [email protected]
      

  13.   

    不好意思在问你最后一个问题
    我现在在C:盘下有一123.exe文件
    我现在搜索D盘怎样判断d盘没有123.exe文件和怎么判断搜索完毕>????
      

  14.   

    我现在搜索D盘怎样判断d盘没有123.exe文件?
    搜索123.exe,list控件如果没有内容,就说明没有这个文件
    仔细的看看代码Sub Command1_Click()
        Dim SearchPath As String, FindStr As String
        Dim FileSize As Long
        Screen.MousePointer = vbHourglass
        List1.Clear
        SearchPath = "c:\"
        FindStr = "*.exe"
        FindFilesAPI SearchPath, FindStr
        msgbox "搜索完毕"
        Screen.MousePointer = vbDefault
    End Sub
      

  15.   

    如果在一個沒有子文件夾的文件夾里面查找文件,用Online的第一個API函數查找的例子.
    請問還可省去哪此你碼.