找回密码
 加入
搜索
查看: 3976|回复: 13

[AU3基础] 关于 递归查找当前目录及其子目录下的所有文件 和 ContinueLoop 请教大侠

 火.. [复制链接]
发表于 2011-12-20 17:17:37 | 显示全部楼层 |阅读模式
;=============================
;例子2:递归查找当前目录及其子目录下的所有文件
;=============================
FindAllFile(@ScriptDir)
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 
                        FindAllFile($sDir & "" & $sFile)
                        ContinueLoop
                EndIf
                FileWriteLine("找到的文件.txt",$sDir & "" & $sFile)
        WEnd
        ; 关闭搜索句柄
        FileClose($hSearch)
EndFunc
这是帮助文档的代码
谁能告诉我 13-16 行是怎么回事 怎么在自定义的函数“FindAllFile”内部还能调用自己呢
发表于 2011-12-20 17:24:36 | 显示全部楼层
这是函数,可以重复调用自己,主程序就不建议这么做,这种写法不太好,重入次数太多的话会有问题,重入次数不多就没问题,只要会返回就行。
以前有过一个坛友,老是说内存不够,最后分析是重入太多。

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

发表于 2011-12-20 18:05:32 | 显示全部楼层
嗯...所谓的递归就是自个调用自个啊.
发表于 2011-12-20 19:45:04 | 显示全部楼层
本帖最后由 netegg 于 2011-12-20 19:51 编辑

论坛里有这个操作
那个@extended里的continueloop是干什么用的,根本执行不到这行呀
'如果文件名是一个目录,则 @extended 设置为 1' ---- 枚举到的项是个文件夹的时候枚举该文件夹中文件,也就是替换函数的参数,执行枚举
发表于 2011-12-20 21:07:30 | 显示全部楼层
论坛里有这个操作
那个@extended里的continueloop是干什么用的,根本执行不到这行呀
'如果文件名是一个目录 ...
netegg 发表于 2011-12-20 19:45


当然能执行到continueloop行了,若不想要这行,得这样写才能使找到的文件.txt里的每一行全是文件的

;=============================
;例子2:递归查找当前目录及其子目录下的所有文件
;=============================
FindAllFile(@ScriptDir)
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 
                        FindAllFile($sDir & "\" & $sFile)
                Else
                        FileWriteLine("找到的文件.txt",$sDir & "\" & $sFile)                                                
                EndIf
        WEnd
        ; 关闭搜索句柄
        FileClose($hSearch)
EndFunc
发表于 2011-12-20 21:11:08 | 显示全部楼层
continueloop前面直接跳回函数头了,怎么执行到
发表于 2011-12-20 21:16:10 | 显示全部楼层
回复 6# netegg


    蛋兄,递归,之所以叫做“递归”,开始是“递”,后面还有“归”的过程呀

你只说到“递”了,呵。

这样,你注释掉那行和不注释,看看生成的那个txt文件内容有什么不同就知道了
发表于 2011-12-20 22:00:17 | 显示全部楼层
FileWriteLine 很影响效率~
发表于 2011-12-20 22:03:47 | 显示全部楼层
直接调用命令行生成文件清单吧
 楼主| 发表于 2011-12-20 23:08:49 | 显示全部楼层
回复 8# afan


    那该怎么实现类似的效果呢
发表于 2011-12-20 23:27:29 | 显示全部楼层
Local $sFiles
_FileFindAll(@ScriptDir, $sFiles)
FileWrite('list.txt', $sFiles)

Func _FileFindAll($sDir, ByRef $sOut)
        Local $hSearch = FileFindFirstFile($sDir & '\*.*')
        If $hSearch = -1 Then Return
        While 1
                Local $sFile = FileFindNextFile($hSearch)
                If @error Then ExitLoop
                If @extended Then ContinueLoop _FileFindAll($sDir & '\' & $sFile, $sOut)
                $sOut &= $sDir & '\' & $sFile & @CRLF
        WEnd
        FileClose($hSearch)
EndFunc   ;==>_FileFindAll
发表于 2011-12-21 09:28:24 | 显示全部楼层
回复 7# happytc
受教了,我一直就没想明白,这个'归'字到底指的是什么,惭愧
 楼主| 发表于 2011-12-21 23:18:55 | 显示全部楼层
回复 11# afan


    谢谢啊
发表于 2011-12-22 22:56:18 | 显示全部楼层
版主你真热心啊
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-1 03:37 , Processed in 0.085373 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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