找回密码
 加入
搜索
查看: 3187|回复: 3

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

[复制链接]
发表于 2014-1-1 17:01:29 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2014-1-29 14:30 编辑

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

Local $str
$Drive = DriveGetDrive("FIXED")
For $i = 1 To $Drive[0]
        _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[0]
        $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


请大家帮忙看下,谢谢!
发表于 2014-1-1 19:05:37 | 显示全部楼层
回复 1# smooth


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

评分

参与人数 1金钱 +10 收起 理由
smooth + 10 感谢指点

查看全部评分

 楼主| 发表于 2014-1-1 19:25:00 | 显示全部楼层
本帖最后由 smooth 于 2014-1-1 20:25 编辑

回复 2# user3000

我是根据别人的代码改的,忽略了将搜到文件进行累加,非常感谢!
另外请教一下,为什么当$sDir = "c:"时,只搜索C盘的根目录,必须加上"\"才能搜索整个C盘,而当$sDir = "E:"时,不需要加上"\"就可以搜索整个E盘呢?
 楼主| 发表于 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[0]
    _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
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-28 15:23 , Processed in 0.090321 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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