lindafu 发表于 2012-3-18 12:56:58

AU3搜索效率问题,非常关注

Qokelate 发表于 2012-3-18 14:01:44

本帖最后由 Qokelate 于 2012-3-18 14:10 编辑

回复 15# afan


    AU3方法的话肯定是这两个的,我自己写了个UDF,但CPU占用过高,并且效率不如CMD理想,原型如下,思路是分隔已处理目录的等待处理目录,并分别用两个变量存储对应关系,推测CPU占用过高是因为句柄的频繁释放和申请, 以及过多的文本处理


func ListDIR($dirPath)
If Not FileExists($DirPath & '\') Then Return
Local $tgrPath = $DirPath
Local $hSearch, $FindFile, $DirList, $FileList, $ListCache, $FileCount, $DirCount, $Tmp
While $tgrPath
$ListCache &= $tgrPath & @CRLF
$hSearch = FileFindFirstFile($tgrPath & '\*.*')
If $hSearch <> -1 Then
   While 1
    $FindFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    $FindFile = $tgrPath & '\' & $FindFile
    If FileExists($FindFile & '\') Then
      $DirList &= $FindFile & @CRLF
      $DirCount += 1
    Else
   $FileList &= $FindFile & @CRLF
   $FileCount += 1
    EndIf
   WEnd
   FileClose($hSearch)
EndIf
$tgrPath = ''

$Tmp = StringRegExp($DirList, '.*', 1)
If $Tmp Then
   $tgrPath = $Tmp
   $DirList = StringReplace($DirList, $Tmp & @LF, '')
   $tgrPath = StringReplace($tgrPath, @CR, '')
EndIf

WEnd
endfunc
;$fileList=搜索到的文件
;$dirList=搜索到的目录
;$FileCount=文件计数器
;$dirList=目录计数器

lindafu 发表于 2012-3-18 14:14:45

如果能把“CMD”做成层搜索,效率将是AU3的N倍

Qokelate 发表于 2012-3-18 14:50:40

回复 18# lindafu


    这个并不难,只是,我更偏爱用纯Au3

xms77 发表于 2012-3-18 15:09:11

效率问题,关注一下,一直认为au3程序处理的是不讲速率的,只有能把事情做好就行,看了我太肤浅了,呵呵!

netegg 发表于 2012-3-18 16:19:27

记得api里好像有个直接获取获取目录树的函数,不知道效率如何,或者是记错了

andersonljw 发表于 2012-3-19 12:35:13

电脑再快些不差1、2秒

smartzbs 发表于 2012-3-19 20:23:52

我不用cmd的au写法:http://www.autoitx.com/thread-31034-1-1.html
用File System Obj方法,在我电脑上找出c:\windows下所有文件(9250个文件),并存为数组,只花了1.04020835328356秒.
很容易进行改造(不使用另外的函数如FileGetTime,FileGetSize,FileGetAttrib),使之只找指定文件名、指定日期、指定大小、指定属性的文件

Qokelate 发表于 2012-3-20 01:59:04

回复 23# smartzbs


    。。。
实测你的效率还不如我的高

afan 发表于 2012-3-20 02:13:36

回复smartzbs


    。。。
实测你的效率还不如我的高
Qokelate 发表于 2012-3-20 01:59 http://www.autoitx.com/images/common/back.gif


    确实不算高~ 用 FileFindFirstFile()、FileFindNextFile() 至少高几倍…

3mile 发表于 2012-3-20 18:36:23

貌似用Filefind递归并不慢啊。
#include <array.au3>
Global $txt
$time=TimerInit()
FindAllFile("c:\windows")
$array=StringRegExp($txt,"[^|]+",3)
MsgBox(0,0,"用时:"&TimerDiff($time)&"毫秒")
_ArrayDisplay($array)

Func FindAllFile($sDir)
    Local $hSearch = FileFindFirstFile($sDir & "\*.*")
    ; 检查搜索是否成功
    If $hSearch = -1 Then Return
    While 1
      Local $sFile = FileFindNextFile($hSearch)
      If @error Then ExitLoop
      
      If @extended Then
                        $txt&=$sDir & "\" & $sFile&"(Direct)|"
            FindAllFile($sDir & "\" & $sFile)
            ContinueLoop
      EndIf
                $txt&=$sDir & "\" & $sFile&"|"
    WEnd
    ; 关闭搜索句柄
    FileClose($hSearch)
        return $txt
EndFunc

user3000 发表于 2012-3-20 19:11:44

3笑的代码 第1次时超过2秒多
以后再运行, 都是0.3秒多点点

Qokelate 发表于 2012-3-20 21:52:56

回复 26# 3mile


    原来@extend可以这样用啊,看来我真的要认真看看帮助,我把我的代码改了下,又比原来快了不少,哈哈,学习了!!   实测的确比CMD还快,厉害!

mjpop 发表于 2012-3-21 02:11:47

都是可以FileFindFirstFile可以,只是调试的时候有点麻烦

chenronting 发表于 2012-3-22 15:27:41

速度确实很快的。
页: 1 [2]
查看完整版本: 已解决 穷举目录及其文件,用什么方法效率最高?