【已解决】修改myFileListToArray()以高效和可自定义排除目录或文件名
本帖最后由 touch_xu 于 2011-2-24 05:13 编辑主要目的两个,一可以自定义排除目录名或文件名,二是要高效,有其它方法更是求之不得了。
参考代码:
http://autoitx.com/forum.php?mod=viewthread&tid=43&highlight=%D7%D3%C4%BF%C2%BC%CB%D1%CB%F7
myFileListToArray()函数源代码如下:;~example:
;~$sPath="D:\AutoIt\article\autoitv3.0"
;~$aFile=myFileListToArray($sPath,"\.au3$",1,"zt_,_private,BackUp,images")
;~IfIsArray($aFile)Then
;~ For$i=1To$aFile Step1
;~ ConsoleWrite($i&"="&$aFile[$i]&@CRLF)
;~ Next
;~EndIf
;===============================================================================
;
;Description: listsfilesordirectory(subdirectory)inaspecifiedpath(SimilartousingDirwiththe/b/sSwitch)
; 列出目录下所有文件或文件夹,包括子文件夹.(yidabu.com注:autoit官方版本_FileListToArray不包括搜索子文件夹,也不支持正则表达式)
;Syntax: myFileListToArray($sPath,$rPath=0,$iFlag=0,$sPathExclude=0)
;Parameter(s): $sPath=Pathtogeneratefilelistfor要搜索的路径
; $iFlag=determinesweathertoreturnfileorfoldersorboth
; $rPath=Theregularexpressiontocompare.StringRegExpFunctionReferenceFordetails
; 用于搜索的正则表达式,用法同StringRegExp函数
; $iFlag=0(Default)Returnbothfilesandfolders返回所有文件和文件夹
; $iFlag=1ReturnfilesOnly仅返回文件
; $iFlag=2ReturnFoldersOnly仅返回文件夹
; $sPathExclude=whenwordinpath,thefile/folderwillexclude,mulitewordsseparatebycomma(,)
; 在路径中要要排除的词语,多个有,分隔
;
;Requirement(s): autoitv3.2.2.0
;ReturnValue(s): OnSuccess-Returnsanarraycontainingthelistoffilesandfoldersinthespecifiedpath
; OnFailure-Returnstheanemptystring""ifnofilesarefoundandsets@Erroronerrors
; @Error=1Pathnotfoundorinvalid
; @Error=3Invalid$iFlag
; @Error=4NoFile(s)Found
;
;Author(s): byhttp://www.yidabu.com一大步成功社区 http://bbs.yidabu.com/forum-2-1.html
;update: 20070125
;Note(s): Thearrayreturnedisone-dimensionalandismadeupasfollows:
; $array=NumberofFiles\Foldersreturned返回文件/文件夹的数量
; $array=1stFile\Folder(notinclude$sPath)第一个文件/文件夹
; $array=2ndFile\Folder(notinclude$sPath)
; $array=3rdFile\Folder(notinclude$sPath)
; $array=nthFile\Folder(notinclude$sPath)
; SpecialThankstoSolidSnake<MetalGX91atGMaildotcom>(his_FileListToArray)
;===============================================================================
FuncmyFileListToArray($sPath,$rPath=0,$iFlag=0,$sPathExclude=0)
Local$asFileList ;yidabu.com提示:因为要用递归调用,$asFileList参数要单独出来
$asFileList=myFileListToArrayTemp($asFileList,$sPath,$rPath,$iFlag,$sPathExclude)
Return$asFileList
EndFunc ;==>myFileListToArray
FuncmyFileListToArrayTemp(ByRef$asFileList,$sPath,$rPath=0,$iFlag=0,$sPathExclude=0)
Local$hSearch,$sFile
IfNotFileExists($sPath)ThenReturnSetError(1,1,"")
IfNot($iFlag=0Or$iFlag=1Or$iFlag=2)ThenReturnSetError(3,3,"")
$hSearch=FileFindFirstFile($sPath&"\*")
If$hSearch=-1ThenReturnSetError(4,4,"")
While1
$sFile=FileFindNextFile($hSearch)
If@errorThen
SetError(0)
ExitLoop
EndIf
;yidabu.com提示:已经被排除的路径,就不要搜索子目录了
If$sPathExcludeAndStringLen($sPathExclude)>0Then$sPathExclude=StringSplit($sPathExclude,",")
$bExclude=False
IfIsArray($sPathExclude)Then
For$ii=1To$sPathExcludeStep1
IfStringInStr($sPath&"\"&$sFile,$sPathExclude[$ii])Then
$bExclude=True
ExitLoop
EndIf
Next
EndIf
If$bExcludeThenContinueLoop
Select
CaseStringInStr(FileGetAttrib($sPath&"\"&$sFile),"D") ;如果遇到目录
Select
Case$iFlag=1 ;求文件时就递归
myFileListToArrayTemp($asFileList,$sPath&"\"&$sFile,$rPath,$iFlag,$sPathExclude)
ContinueLoop ;求文件时跳过目录
Case$iFlag=2Or$iFlag=0 ;求目录时分两种情况
If$rPathThen ;1如果要求对路径进行正则匹配
IfNotStringRegExp($sPath&"\"&$sFile,$rPath,0)Then ;正则匹配失败就递归
myFileListToArrayTemp($asFileList,$sPath&"\"&$sFile,$rPath,$iFlag,$sPathExclude)
ContinueLoop ;正则匹配失败时跳过本目录
Else ;正则匹配成功就递归,并把本目录加入匹配成功
myFileListToArrayTemp($asFileList,$sPath&"\"&$sFile,$rPath,$iFlag,$sPathExclude)
EndIf
Else ;2如果不要求对路径进行正则匹配,递归,并把本目录加入匹配成功,
myFileListToArrayTemp($asFileList,$sPath&"\"&$sFile,$rPath,$iFlag,$sPathExclude)
EndIf
EndSelect
CaseNotStringInStr(FileGetAttrib($sPath&"\"&$sFile),"D") ;如果遇到文件
If$iFlag=2ThenContinueLoop ;求目录时就跳过
;yidabu.com提示:要求正则匹配路径,且匹配失败时就跳过。遇文件就不要递归调用了。
If$rPathAndNotStringRegExp($sPath&"\"&$sFile,$rPath,0)ThenContinueLoop
EndSelect
ReDim$asFileList
$asFileList=$asFileList+1
$asFileList=$sPath&"\"&$sFile
WEnd
FileClose($hSearch)
Return$asFileList
EndFunc ;==>myFileListToArrayTemp 等高手出现 实际上 _FileListToArray 已经很高效了...舍近求远 实际上 _FileListToArray 已经很高效了...舍近求远
Hen5ei 发表于 2011-2-3 21:59 http://autoitx.com/images/common/back.gif
但是如何跳过目录呢 但是如何跳过目录呢
touch_xu 发表于 2011-2-4 13:16 http://www.autoitx.com/images/common/back.gif
修改第二个可选参数
[可选参数]指定是否返回文件或文件夹;或者两者都返回:
设为 0 (默认) 返回文件和文件夹.
设为 1 只返回文件
设为 2 只返回文件夹 本帖最后由 touch_xu 于 2011-2-5 00:16 编辑
修改第二个可选参数
Hen5ei 发表于 2011-2-4 18:08 http://autoitx.com/images/common/back.gif
返回文件夹后还要再一次的对返回目录_进行FileListToArray 不是很麻烦吗,关键是有很多子目录,我只是很想找一种解决问题的方法,问题是可以解决的,但是我想一定有人能找到便捷的方法,谢谢了 返回文件夹后还要再一次的对返回目录_进行FileListToArray 不是很麻烦吗,关键是有很多子目录,我 ...
touch_xu 发表于 2011-2-4 23:56 http://www.autoitx.com/images/common/back.gif
那就遍历文件... 麻烦的事情就交给电脑做好了.你就坐享其成吧 就一个遍历就OK了啊。个人觉得这个函数还是挺有用的。在这个函数基础上,还可以写不少自己想要的函数。 好像楼主求过这个问题啊,还没有解决?
翻箱倒柜找出当时的代码出来,再给出来.
#include <array.au3>
$searchdir1 = "c:\windows"
Local $flag='*.dll'
Local $flag1 = "c:\windows\system", $flag2 = 'c:\windows\system32'
Local $lines, $direct, $array
_filelist($searchdir1, $flag,$flag1, $flag2);_filelist('搜索目录','要搜索的扩展名','排除目录1','排除目录2','排除目录3','排除目录4')
$a = StringSplit(StringTrimRight($lines,1), '|')
_ArrayDisplay($a)
Func _filelist($searchdir, $flag, $es1 = '', $es2 = '', $es3 = '',$es4='')
$search = FileFindFirstFile($searchdir & "\*")
If $search = -1 Then Return -1
While 1
$File = FileFindNextFile($search)
If @error Then
FileClose($search)
Return
ElseIf $File = "." Or $File = ".." Then
ContinueLoop
ElseIf StringInStr(FileGetAttrib($searchdir & "\" & $File), "D") Then ;And $searchdir & "\" & $File <> $flag Then
Select
Case $searchdir & "\" & $File = $es1
ContinueLoop
Case $searchdir & "\" & $File = $es2
ContinueLoop
Case $searchdir & "\" & $File = $es3
ContinueLoop
Case $searchdir & "\" & $File = $es4
ContinueLoop
Case Else
_filelist($searchdir & "\" & $File, $flag, $es1 = '', $es2 = '', $es3 = '',$es4)
ContinueLoop
EndSelect
EndIf
If StringRight($searchdir & "\" & $File,4)=StringRight($flag,4) Then
$lines &= $searchdir & "\" & $File & "|"
$array = StringSplit(StringTrimRight($lines, 1), '|')
EndIf
WEnd
Return $array
EndFunc ;==>_filelist
再次谢谢3mile 已经可以用
页:
[1]