pigWoWo 发表于 2012-3-22 02:01:03

[已解决]_FileListToArray同时选择两种格式有bmp和jpg

本帖最后由 pigWoWo 于 2012-3-30 12:13 编辑

各位大大,请问我要选择 文件夹下的图片,格式有bmp和jpg两种 ,要怎么写这个函数的语句呢?
谢谢~自己试了老半天 ,实在比较白菜 ...


_FileListToArray(@ScriptDir,"*.bmp|*.jpg",1)   


貌似不行

Ycxw2008 发表于 2012-3-22 04:03:45

本帖最后由 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

xms77 发表于 2012-3-22 06:02:18

一次不行就用两次filelisttoarray

lixiaolong 发表于 2012-3-22 16:38:13

本帖最后由 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:10:21

本帖最后由 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

xms77 发表于 2012-3-22 20:05:57

回复 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) ;合并后数组显示

netegg 发表于 2012-3-22 20:32:10

回复 6# xms77

这个有子目录吗

lixiaolong 发表于 2012-3-22 20:40:07

回复 5# netegg

我以为楼主是只在@ScriptDir搜索文件,所以没想太多...

netegg 发表于 2012-3-22 20:42:15

本帖最后由 netegg 于 2012-3-22 20:47 编辑

回复 8# lixiaolong
不过谁知道楼主的意思呢,可能我想多了
如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素

xms77 发表于 2012-3-22 20:50:10

回复 7# netegg
蛋哥,我看楼主的代码中是选项是"1",应该只要得到指定文件夹中的文件,楼主没说要历遍文件夹,所以。。。。。。

netegg 发表于 2012-3-22 20:52:49

回复 10# xms77
那倒是直接用就行,不过首项还是要删,尤其是第二个数组的

lixiaolong 发表于 2012-3-22 21:38:22

回复 9# netegg

【如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素】
这个有点不懂...为什么要删除数组的首元素哪?

xms77 发表于 2012-3-22 22:20:41

回复 11# netegg
蛋哥,第二个数组的首元素直接跳过,第一个数组的首元素还是放合并后的数量。

netegg 发表于 2012-3-22 22:54:37

回复 13# xms77
那个首元素要重新算,还不如不加

pigWoWo 发表于 2012-3-23 13:50:00

哈哈, 好多回复 ,谢谢大家哈,其实 我只要 加个分号 就OK了,谢谢谢谢谢谢~
页: [1] 2
查看完整版本: [已解决]_FileListToArray同时选择两种格式有bmp和jpg