cumtljj 发表于 2011-12-20 17:17:37

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

;=============================
;例子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

这是函数,可以重复调用自己,主程序就不建议这么做,这种写法不太好,重入次数太多的话会有问题,重入次数不多就没问题,只要会返回就行。
以前有过一个坛友,老是说内存不够,最后分析是重入太多。

user3000 发表于 2011-12-20 18:05:32

嗯...所谓的递归就是自个调用自个啊.

netegg 发表于 2011-12-20 19:45:04

本帖最后由 netegg 于 2011-12-20 19:51 编辑

论坛里有这个操作
那个@extended里的continueloop是干什么用的,根本执行不到这行呀
'如果文件名是一个目录,则 @extended 设置为 1' ---- 枚举到的项是个文件夹的时候枚举该文件夹中文件,也就是替换函数的参数,执行枚举

happytc 发表于 2011-12-20 21:07:30

论坛里有这个操作
那个@extended里的continueloop是干什么用的,根本执行不到这行呀
'如果文件名是一个目录 ...
netegg 发表于 2011-12-20 19:45 http://www.autoitx.com/images/common/back.gif

当然能执行到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

netegg 发表于 2011-12-20 21:11:08

continueloop前面直接跳回函数头了,怎么执行到

happytc 发表于 2011-12-20 21:16:10

回复 6# netegg


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

你只说到“递”了,呵。

这样,你注释掉那行和不注释,看看生成的那个txt文件内容有什么不同就知道了

afan 发表于 2011-12-20 22:00:17

FileWriteLine 很影响效率~

kevinch 发表于 2011-12-20 22:03:47

直接调用命令行生成文件清单吧

cumtljj 发表于 2011-12-20 23:08:49

回复 8# afan


    那该怎么实现类似的效果呢

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

netegg 发表于 2011-12-21 09:28:24

回复 7# happytc
受教了,我一直就没想明白,这个'归'字到底指的是什么,惭愧

cumtljj 发表于 2011-12-21 23:18:55

回复 11# afan


    谢谢啊

jiang1234 发表于 2011-12-22 22:56:18

版主你真热心啊
页: [1]
查看完整版本: 关于 递归查找当前目录及其子目录下的所有文件 和 ContinueLoop 请教大侠