找回密码
 加入
搜索
楼主: Qokelate

[AU3基础] 已解决 穷举目录及其文件,用什么方法效率最高?

 火... [复制链接]
发表于 2012-3-18 12:56:58 | 显示全部楼层
AU3搜索效率问题,非常关注
 楼主| 发表于 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[0] Then
   $tgrPath = $Tmp[0]
   $DirList = StringReplace($DirList, $Tmp[0] & @LF, '')
   $tgrPath = StringReplace($tgrPath, @CR, '')
  EndIf

 WEnd
endfunc
;$fileList=搜索到的文件
;$dirList=搜索到的目录
;$FileCount=文件计数器
;$dirList=目录计数器
发表于 2012-3-18 14:14:45 | 显示全部楼层
如果能把“CMD”做成层搜索,效率将是AU3的N倍
 楼主| 发表于 2012-3-18 14:50:40 | 显示全部楼层
回复 18# lindafu


    这个并不难,只是,我更偏爱用纯Au3
发表于 2012-3-18 15:09:11 | 显示全部楼层
效率问题,关注一下,一直认为au3程序处理的是不讲速率的,只有能把事情做好就行,看了我太肤浅了,呵呵!
发表于 2012-3-18 16:19:27 | 显示全部楼层
记得api里好像有个直接获取获取目录树的函数,不知道效率如何,或者是记错了
发表于 2012-3-19 12:35:13 | 显示全部楼层
电脑再快些不差1、2秒
发表于 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),使之只找指定文件名、指定日期、指定大小、指定属性的文件
 楼主| 发表于 2012-3-20 01:59:04 | 显示全部楼层
回复 23# smartzbs


    。。。
实测你的效率还不如我的高
发表于 2012-3-20 02:13:36 | 显示全部楼层
回复  smartzbs


    。。。
实测你的效率还不如我的高
Qokelate 发表于 2012-3-20 01:59



    确实不算高~ 用 FileFindFirstFile()、FileFindNextFile() 至少高几倍…
发表于 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

评分

参与人数 2金钱 +52 贡献 +5 收起 理由
lynfr8 + 22 + 5
Qokelate + 30

查看全部评分

发表于 2012-3-20 19:11:44 | 显示全部楼层
3笑的代码 第1次时超过2秒多
以后再运行, 都是0.3秒多点点
 楼主| 发表于 2012-3-20 21:52:56 | 显示全部楼层
回复 26# 3mile


    原来@extend可以这样用啊,看来我真的要认真看看帮助,我把我的代码改了下,又比原来快了不少,哈哈,学习了!!   实测的确比CMD还快,厉害!
发表于 2012-3-21 02:11:47 | 显示全部楼层
都是可以FileFindFirstFile可以,只是调试的时候有点麻烦
发表于 2012-3-22 15:27:41 | 显示全部楼层
速度确实很快的。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-16 17:19 , Processed in 0.081485 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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