Google
      
发新话题
打印

AU3,自定义函数的递归调用实例

AU3,自定义函数的递归调用实例

AU3的用户自定义函数是可以递归调用的,递归调用是用一个函数解决无数个同样的问题。比如判断一个数被整除的次数,等等。
我们常遇到这样的问题:给你个目录你能找出某一类的文件有多少个吗?比如:TXT文件、gho文件,我编了一段程序,利用递归调用能完整找出全部匹配文件,其中包括其下方所有的子目录下的,找出的文件以全路径名保存于一个特定的数组中,以下就是其源代码:
**********************代码开始*************************
;--------其中有子函数显示数组全部信息的,不需要显示时可以不要(第36行调用)----------
#i nclude <Array.au3>
;-------------从“File.au3”里摘录进来的:作用是返回文件及文件夹数组--------------
Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
Local $hSearch, $sFile, $asFileList[1]
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If (StringInStr($sFilter, "\")) Or (StringInStr($sFilter, "/")) Or (StringInStr($sFilter, ":")) Or (StringInStr($sFilter, ">")) Or (StringInStr($sFilter, "<")) Or (StringInStr($sFilter, "|")) Or (StringStripWS($sFilter, 8) = "") Then Return SetError(2, 2, "")
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
$hSearch = FileFindFirstFile($sPath & "\" & $sFilter)
If $hSearch = -1 Then Return SetError(4, 4, "")
While 1
  $sFile = FileFindNextFile($hSearch)
  If @error Then
   SetError(0)
   ExitLoop
  EndIf
  If $iFlag = 1 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") <> 0 Then ContinueLoop
  If $iFlag = 2 And StringInStr(FileGetAttrib($sPath & "\" & $sFile), "D") = 0 Then ContinueLoop
  ReDim $asFileList[UBound($asFileList) + 1]
  $asFileList[0] = $asFileList[0] + 1
  $asFileList[UBound($asFileList) - 1] = $sFile
WEnd
FileClose($hSearch)
Return $asFileList
EndFunc   ;==>返回一个数组
;----------以下是假设的目标目录和要找的匹配文件类型-------------
$OldPath="e:"
$OldFileLX="*.gho"
;------------以下是必须的全局变量命名---------------------------------
Global $FileNumber=0  ;记录数组维数,全局变量
Global $FileArray[1]  ;返回的文件名主数组(全路径),全局变量
;----------------以下是用户命令----------------
FindFiles($OldPath,$OldFileLX);调用语句
$FileArray[0]=$FileNumber;维数付给数组【0】
_ArrayDisplay($FileArray,"hhhh");调用“Array.au3”的子函数函数,显示整个数组信息
;----------------以下是由顽固不化写的递归调用函数:找所有匹配文件---------------------
;-----注意:必须和以上两个全局变量一起使用。  顽固不化 于 2008.4.22--------------------
Func FindFiles($path,$filelx)        ;查找当前目录和所有子目录下的匹配文件函数
Local $filelist
Local $folders
Local $i,$j,$newpath
$filelist=_FileListToArray ($path,$filelx,1)    ;调用“File.au3”的子函数,返回匹配文件数组
if not @error then
  if $filelist[0]>0 Then
   for $i=1 to $filelist[0]
    $FileNumber=$FileNumber+1
    ReDim $FileArray[UBound($FileArray) + 1]   
    $FileArray[$FileNumber]=$path&"\"&$filelist[$i]  ;给主数组赋值
   Next
  EndIf
EndIf
  $folders=_FileListToArray ($path,"*",2)   ;调用“File.au3”的子函数,返回子目录数组
if  not @error Then
   if $folders[0]>0 Then
    For $j=1 to $folders[0]
     $newpath=$path&"\"&$folders[$j]
     FindFiles($newpath,$filelx)          ;进入子目录递归调用本身找匹配文件
    Next
   EndIf
  EndIf
EndFunc
;-----------结束---------------------------
好不容易忙完,现在总算有点时间了。不能及时回答大家的问题,还请大家多多包函。
勇于思考,敢于行动,不逃避问题。
业务联系:dvd制作,各种系统、软件光盘定制,平面广告设计、3D设计,电脑专业维修,网络组建,MTV个人像册、视频处理!
电话:15820835149

TOP

发新话题