#include <Array.au3>
Local $filefolder = FileSelectFolder("", "") ;选择一个文件,得到一个带路径的文件名字符串
Local $T = TimerInit() ;开始计时
Local $sFiles = _FileListEx($filefolder) ;列出目录下所有文件,以" |"分开
Select
Case @error ;如果出错
ConsoleWrite("原始文件夹不存在" & @CRLF) ;写入数据流原始文件不存在。
Case $sFiles ;如果是带路径的文件名字符串
;StringSplit ( "字符串", "分隔符" [, 标志 = 0] ) ;拆分字符串为若干子串.
; 标志 $STR_NOCOUNT (2) = 禁用返回表示元素数量的第一个元素 - 方便使用基于 0 开始的数组.(此时的数组大小由 UBound() 函数检测).
;常量定义在 StringConstants.au3
Local $a_FileList = StringSplit($sFiles, "|") ;返回拆分了的子串符串以数组表示,第一个元素里含折分的子串总数
;TimerDiff ( 句柄 )
;句柄 之前调用 TimerInit() 返回的句柄.
;返回当前与之前调用 TimerInit() 之间的时间间隔(毫秒).
ConsoleWrite("耗时:" & TimerDiff($T) / 1000 & "秒,共有文件数:" & $a_FileList[0] & @CRLF);耗时:1.04020835328356秒,共有文件数:9250
_ArrayDisplay($a_FileList, "$a_FileList")
;$a_FileList[1..n]: 带路径的文件名
Case Else ;$sFiles="" ;如果什么都没有,写入数据流,没有找到文件
ConsoleWrite("没有找到文件" & @CRLF)
EndSelect
Func _FileListEx($filefolder)
; local $ml=FileGetAttrib($filefolder)
; MsgBox(0,"文件属性代码为",$ml)
;FileGetAttrib($filefolder) 返回选择文件的属性的代码字符串.
; String()返回的字符串可能包含 "RASHNDOCT" 字符的组合:
;"R" = 只读文件
;"A" = 存档文件
;"S" = 系统文件
;"H" = 隐藏文件
;"N" = 普通文件
;"D" = 目录文件
;"O" = 脱机文件
;"C" = 压缩文件 (NTFS 压缩, 并非 ZIP/RAR 压缩)
;"T" = 临时文件
;StringInStr ( "字符串", "子字符串" [, 区分大小写 = 0 [, 出现位置 = 1 [, 开始 = 1 [, 数量]]]] ) 返回子串在字符串中的开始位置. 返回 0, 未发现匹配子串.
;SetError ( 代码 [, 扩展值 = 0 [, 返回值 ]] ) 设置宏 @error 的值(可选设置 @extended). @error 限定值在 -2147483648 到 2147483647 之间.
If StringInStr(FileGetAttrib($filefolder), "D") = 0 Then Return SetError(1, 0, "") ;检查选择的文件夹属性的代码字符串是否为包含了“d”即是否为目录文件,并返回开始位置,
; 若返回值为0,则设置@ERROR的值为0
; MsgBox(0,"@ERROR",@ERROR)
; MsgBox(0,"@extended",@extended)
;ObjCreate ( "类名称" [, "服务器名称" [,"用户名", ["密码"]]] ) 对象的类名称, 格式如下: "appname.objectype"(程序名.对象类型)
Local $oFSO = ObjCreate("Scripting.FileSystemObject") ;创建$OFSO对像
Local $objDir ;定义OBj对像目录函数
Local $aDir = StringSplit($filefolder, "|", 2) ;返回所选文件夹目录下所有的含目录的文件名的数组,并禁用第一个元素 ,方便使用基于 0 开始的数组
Local $iCnt = 0 ;设置计数为0
Local $sFiles = "" ;定义一个收到的文件参数目录为空
Do
$objDir = $oFSO.GetFolder($aDir[$iCnt]) ;获取文件目录
For $aItem In $objDir.SubFolders ;获取文件名
;扩展应用改下这句, 如指定文件夹 If StringInStr($aItem.Name, "XXX") Then
$filefolder &= "|" & $aItem.Path
;文件夹层数可以通过 StringReplace($aItem.Path, "", "", 0, 1)的@extended值来判断
Next
;如果仅找文件夹,不找文件,$sFiles的语句都不用,最后是 Return $filefolder
For $aItem In $objDir.Files
;扩展应用改下面这句
$sFiles &= $aItem.Path & "|"
;例如要找文件名中包含"kb"(不分大小写),改为: if StringInStr($aItem.Name, "kb") Then $sFiles &= $aItem.Path & "|"
;其他应用请参照上例修改: $aItem.XXX
;Attributes 设置或返回文件或文件夹的属性
;DateCreated 返回指定的文件或文件夹的创建日期和时间。只读
;DateLastAccessed 返回指定的文件或文件夹的上次访问日期(和时间)。只读
;DateLastModified 返回指定的文件或文件夹的上次修改日期和时间。只读
;ShortName 返回按照早期8.3文件命名约定转换的短文件名
;ShortPath 返回按照早期8.3命名约定转换的短路径名
;Size 对于文件返回指定文件的字节数;对于文件夹,返回文件夹所有的文件夹和子文件夹的字节数
;Type 返回文件或文件夹的类型信息
Next
$iCnt += 1
If UBound($aDir) <= $iCnt Then $aDir = StringSplit($filefolder, "|", 2)
Until UBound($aDir) <= $iCnt
If $sFiles Then $sFiles = StringTrimRight($sFiles, 1);去掉最右边"|"
Return $sFiles
EndFunc ;==>_FileListEx