smooth 发表于 2014-1-1 17:01:29

【已解决】请教如何将全盘搜索到的文件存入数组?

本帖最后由 smooth 于 2014-1-29 14:30 编辑

请教如何将全盘搜索到的文件存入数组?代码如下,这样只能用消息框的方式显示出来,想存入数组方便调用,谢谢!

Local $str
$Drive = DriveGetDrive("FIXED")
For $i = 1 To $Drive
        _Filelist($Drive[$i])
Next
MsgBox(0, 0, $str)
Func _Filelist($SearchDir)
        $Search = FileFindFirstFile($SearchDir & "\*.*")
        If $Search = -1 Then Return -1
        While 1
                $File = FileFindNextFile($Search)
                If @error Then
                        FileClose($Search)
                        Return
                ElseIf $file = "." Or $file = ".." Then
                        ContinueLoop
                Else
                        _Filelist($SearchDir & "\" & $File)
                EndIf
                $str &= $SearchDir & "\" & $File & @CRLF
        WEnd
EndFunc   ;==>_Filelist


另:下面的代码能将找到文件存入数组,但是查找最后一个分区的文件,不能实现全盘搜索。

#include <Array.au3>

$Drive = DriveGetDrive("FIXED")
For $i = 1 To $Drive
        $sFiles = _FileListEx($Drive[$i] & "\")
Next

$aFiles = StringSplit($sFiles, "|")
_ArrayDisplay($aFiles,"")

Func _FileListEx($sDir)
        If StringInStr(FileGetAttrib($sDir), "D") = 0 Then Return SetError(1, 0, "")

        Local $oFSO = ObjCreate("Scripting.FileSystemObject")
        Local $objDir

        Local $aDir = StringSplit($sDir, "|", 2)
        Local $iCnt = 0
        Local $sFiles = ""
        Do
                $objDir = $oFSO.GetFolder($aDir[$iCnt])
                For $aItem In $objDir.SubFolders
                        $sDir &= "|" & $aItem.Path
                Next
                For $aItem In $objDir.Files
                        $sFiles &= $aItem.Path & "|"
                Next
                $iCnt += 1
                If UBound($aDir) <= $iCnt Then $aDir = StringSplit($sDir, "|", 2)
        Until UBound($aDir) <= $iCnt
        If $sFiles Then $sFiles = StringTrimRight($sFiles, 1)
        Return $sFiles
EndFunc   ;==>_FileListEx


请大家帮忙看下,谢谢!

user3000 发表于 2014-1-1 19:05:37

回复 1# smooth


    因为你没认真看代码吧,原代码是一个个分区“搜”过去,但只显示了最后一个分区的文件。
要实现全盘搜索,稍稍修改一点代码就可以了Local $sFiles = '', $Drive
$Drive = DriveGetDrive("FIXED")
For $i = 1 To $Drive
      $sFiles &= _FileListEx($Drive[$i] & "\")
Next

smooth 发表于 2014-1-1 19:25:00

本帖最后由 smooth 于 2014-1-1 20:25 编辑

回复 2# user3000

我是根据别人的代码改的,忽略了将搜到文件进行累加,非常感谢!
另外请教一下,为什么当$sDir = "c:"时,只搜索C盘的根目录,必须加上"\"才能搜索整个C盘,而当$sDir = "E:"时,不需要加上"\"就可以搜索整个E盘呢?

smooth 发表于 2014-1-2 16:42:58

本帖最后由 smooth 于 2014-1-2 16:49 编辑

全盘(所有硬盘分区)搜索文件并存入数组,我电脑30多万个文件,耗时80多秒。可以根据需要修改,如根据设定的目录层数搜索,根据设定的关键字搜索。

#include <Array.au3>
Local $sFiles, $aFiles

$Drive = DriveGetDrive("FIXED")
For $i = 1 To $Drive
    _Filelist($Drive[$i])
Next

$sFiles = StringTrimRight($sFiles, 1)
$aFiles = StringSplit($sFiles, "|")
_ArrayDisplay($aFiles, "")

Func _Filelist($SearchDir)
    $Search = FileFindFirstFile($SearchDir & "\*.*")
    If $Search = -1 Then Return -1
    While 1
      $File = FileFindNextFile($Search)
      If @error Then
            FileClose($Search)
            Return
      ElseIf $file = "." Or $file = ".." Then
            ContinueLoop
      Else
            _Filelist($SearchDir & "\" & $File)
      EndIf
      if Not StringInStr(FileGetAttrib($searchdir & "\" & $file), "D") Then                       
             $sFiles &= $SearchDir & "\" & $File & "|"
      EndIf
    WEnd
EndFunc   ;==>_Filelist
页: [1]
查看完整版本: 【已解决】请教如何将全盘搜索到的文件存入数组?