第二类型暂改为非递归如下。先不支持正则,支持正则的我等会再改一份。
用法(前面部分参数与_FileListToArray一致)如:
$array = myFileListToArray("c:\windows", "*", 0, True, "")
;遍历c:\windows下所有文件
$array = myFileListToArray("c:\windows", "*", 0, True, ".exe$")
;遍历c:\windows下所有文件,除了exe文件
$array = myFileListToArray("c:\windows", "*", 0, True, ".exe$|.dll$")
;遍历c:\windows下所有文件,除了.exe和.dll文件
Func myFileListToArray($s_dir, $s_filt = "*", $i_flag = 0, $b_subdir=True, $s_ex="")
If StringRight($s_dir,1)="\" Then $s_dir = StringTrimRight($s_dir,1)
If $i_flag<1 Or $i_flag>2 Then $i_flag=0;规范
Local $i_step = 40000 ;每$i_step个文件重新定义一次数组大小,当文件很多时,此值就发挥作用
Local $a_return[$i_step+1];初始数组大小,[0]存放共有多少个文件,因为每次一直ReDim很慢的
Local $i_count = 1;记录找到多少个文件$i_count-1
Local $a_dir[$i_step+1];初始数组大小,[0]存放共有多少个文件,因为每次一直ReDim很慢的
$a_dir[0] = 1;做到第几个数组,代替递归
$a_dir[1] = $s_dir
$i_dirCount = 1;共有多少个数组,代替递归用的变量
Local $a_dir_temp, $isdir, $a_temp
Local $file, $search
While $a_dir[0]<=$i_dirCount;阿福提示,代替递归的方法
$s_dir = $a_dir[$a_dir[0]]
If $b_subdir Then;子目录搜索
$a_dir_temp = _FileListToArray($s_dir, "*", 2)
If UBound($a_dir_temp)>1 Then
If $i_dirCount+$a_dir_temp[0]>UBound($a_dir)-1 Then ReDim $a_dir[UBound($a_dir)+$a_dir_temp[0]+$i_step];每次都ReDim会很慢
For $i = 1 To UBound($a_dir_temp)-1
$a_dir[$i_dirCount+$i] = $s_dir &"\"& $a_dir_temp[$i]
Next
$i_dirCount += $a_dir_temp[0];共有多少个数组,即多少个目录
EndIf
EndIf
If ($i_flag = 2) And ($s_filt = "*" Or $s_filt = "*.*") And $b_subdir Then;和上面条件相同,不用再做一次
;ConsoleWrite("same"&@crlf)
Else
$a_dir_temp = _FileListToArray($s_dir, $s_filt, $i_flag)
EndIf
If UBound($a_dir_temp)>1 Then
If $i_Count+$a_dir_temp[0]>UBound($a_return)-1 Then ReDim $a_return[UBound($a_return)+$a_dir_temp[0]+$i_step]
;阿福提示:每次都ReDim会很慢
;ConsoleWrite($i_Count&','&$a_dir_temp[0]&','&$i_Count+$a_dir_temp[0]&','&UBound($a_return)-1&@CRLF)
For $i = 1 To UBound($a_dir_temp)-1
;其他条件
If $s_ex<>"" Then
$a_temp = StringSplit($s_ex, "|")
For $j= 1 To UBound($a_temp)-1
If StringRight($a_temp[$j],1)="$" Then
$a_temp[$j]=StringTrimRight($a_temp[$j],1)
If StringRight($a_dir_temp[$i], StringLen($a_temp[$j]))=$a_temp[$j] Then ContinueLoop(2)
Else
If StringInStr($a_dir_temp[$i], $a_temp[$j])>0 Then ContinueLoop(2)
EndIf
Next
EndIf
;---------------
$a_return[$i_Count] = $s_dir &"\"& $a_dir_temp[$i]
$i_Count += 1
Next
EndIf
$a_dir[0] += 1
WEnd;代替递归结束
$a_return[0] = $i_count - 1
ReDim $a_return[$i_count]
Return $a_return
EndFunc |