[已解决]_FileListToArray同时选择两种格式有bmp和jpg
本帖最后由 pigWoWo 于 2012-3-30 12:13 编辑各位大大,请问我要选择 文件夹下的图片,格式有bmp和jpg两种 ,要怎么写这个函数的语句呢?
谢谢~自己试了老半天 ,实在比较白菜 ...
_FileListToArray(@ScriptDir,"*.bmp|*.jpg",1)
貌似不行 本帖最后由 Ycxw2008 于 2012-3-22 05:02 编辑
$run=Run('"' & @ComSpec & '" /c dir /a:-d /b *.png;*.bmp',@Scriptdir, @SW_HIDE,7)
;完整路径加个/s
ProcessWaitClose($run)
$Std=StdoutRead($run)
MsgBox(0, '', $Std)
看下面_FileListToArray源码
Func _FileListToArray($sPath, $sFilter = "*", $iFlag = 0)
; 假如按你说的,这个时候
;$sFilter="*.bmp|*.jpg"
Local $hSearch, $sFile, $sFileList, $sDelim = "|"
$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\" ; ensure single trailing backslash
If Not FileExists($sPath) Then Return SetError(1, 1, "")
If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
;那么这个时候就返回错误2了
If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, "")
$hSearch = FileFindFirstFile($sPath & $sFilter)
If @error Then Return SetError(4, 4, "")
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If ($iFlag + @extended = 2) Then ContinueLoop
$sFileList &= $sDelim & $sFile
WEnd
FileClose($hSearch)
If Not $sFileList Then Return SetError(4, 4, "")
Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc ;==>_FileListToArray 一次不行就用两次filelisttoarray 本帖最后由 lixiaolong 于 2012-3-22 16:47 编辑
随便改了一点,可以搜索多个格式,只检查文件的.
要搜索所有格式直接用_FileListToArray()吧.
#include <Array.au3>
; 只检查文件
$a = __FileListToArray('C:\Windows', "*.exe|*.dll|*.txt")
_ArrayDisplay($a)
Func __FileListToArray($sPath, $sFilter)
Local $Count = 1, $sFileList, $sDelim = "|"
$sFilter = StringReplace($sFilter, '*', '')
$search = FileFindFirstFile($sPath & "\*.*")
If $search = -1 Then
MsgBox(0, "错误", "没有匹配搜索的文件/目录")
Return SetError(1)
EndIf
$Split = StringSplit($sFilter, '|', 1)
If Not @error Then $Count = $Split
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
If Not @extended Then
For $i = 1 To $Count
If StringRight($file, 4) = $Split[$i] Then
$sFileList &= $sDelim & $sPath & '\' & $file
EndIf
Next
EndIf
WEnd
FileClose($search)
If Not $sFileList Then Return SetError(1)
Return StringSplit(StringTrimLeft($sFileList, 1), "|")
EndFunc ;==>__FileListToArray
本帖最后由 netegg 于 2012-3-22 18:45 编辑
回复 4# lixiaolong
这样是不是累点了,直接stringinstr不是挺好,像代码中那样做相当于搜索了三遍
Func _Seachfilebyext($current, $ext)
If Not ($ext) Then Return SetError(3, 0, 0)
Local $search = FileFindFirstFile($current & "\*.*"), $ret
While 1
Dim $file = FileFindNextFile($search)
If @error Or StringLen($file) < 1 Then ExitLoop
If Not StringInStr(FileGetAttrib($current & "\" & $file), "D") And ($file <> "." Or $file <> "..") Then
If StringInStr($ext, StringRight($current & "\" & $file, stringlen($file)- StringInStr($file, '.', -1)))Then
consolewrite($current & "\" & $file & @cr)
EndIf
EndIf
If StringInStr(FileGetAttrib($current & "\" & $file), "D") And ($file <> "." Or $file <> "..") Then
_Seachfilebyext($current & "\" & $file, $ext)
EndIf
WEnd
endfunc
回复 5# netegg
回复 4# lixiaolong
我觉得还是用2次_FileListToArray()来的简单#include<array.au3>
#include<file.au3>
$ini = _FileListToArray('C:\Windows', "*.ini",1)
If Not @error Then _ArrayDisplay($ini)
$exe = _FileListToArray('c:\windows',"*.exe",1)
If Not @error Then _ArrayDisplay($exe)
For $i = 1 To $exe
_ArrayAdd($ini,$exe[$i])
$ini += 1
Next
_ArrayDisplay($ini) ;合并后数组显示
回复 6# xms77
这个有子目录吗 回复 5# netegg
我以为楼主是只在@ScriptDir搜索文件,所以没想太多... 本帖最后由 netegg 于 2012-3-22 20:47 编辑
回复 8# lixiaolong
不过谁知道楼主的意思呢,可能我想多了
如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素 回复 7# netegg
蛋哥,我看楼主的代码中是选项是"1",应该只要得到指定文件夹中的文件,楼主没说要历遍文件夹,所以。。。。。。 回复 10# xms77
那倒是直接用就行,不过首项还是要删,尤其是第二个数组的 回复 9# netegg
【如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素】
这个有点不懂...为什么要删除数组的首元素哪? 回复 11# netegg
蛋哥,第二个数组的首元素直接跳过,第一个数组的首元素还是放合并后的数量。 回复 13# xms77
那个首元素要重新算,还不如不加 哈哈, 好多回复 ,谢谢大家哈,其实 我只要 加个分号 就OK了,谢谢谢谢谢谢~
页:
[1]
2