找回密码
 加入
搜索
查看: 8992|回复: 15

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

 火.. [复制链接]
发表于 2012-3-22 02:01:03 | 显示全部楼层 |阅读模式
本帖最后由 pigWoWo 于 2012-3-30 12:13 编辑

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


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


貌似不行
发表于 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
发表于 2012-3-22 06:02:18 | 显示全部楼层
一次不行就用两次filelisttoarray
发表于 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[0]

        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

发表于 2012-3-22 18:10:21 | 显示全部楼层
本帖最后由 netegg 于 2012-3-22 18:45 编辑

回复 4# lixiaolong

这样是不是累点了,直接stringinstr不是挺好,像代码中那样做相当于搜索了三遍
[au3]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
[/au3]
发表于 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[0]
        _ArrayAdd($ini,$exe[$i])
        $ini[0] += 1
Next
_ArrayDisplay($ini) ;合并后数组显示
 
发表于 2012-3-22 20:32:10 | 显示全部楼层
回复 6# xms77

这个有子目录吗
发表于 2012-3-22 20:40:07 | 显示全部楼层
回复 5# netegg

我以为楼主是只在@ScriptDir搜索文件,所以没想太多...
发表于 2012-3-22 20:42:15 | 显示全部楼层
本帖最后由 netegg 于 2012-3-22 20:47 编辑

回复 8# lixiaolong
不过谁知道楼主的意思呢,可能我想多了
如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素
发表于 2012-3-22 20:50:10 | 显示全部楼层
回复 7# netegg
蛋哥,我看楼主的代码中是选项是"1",应该只要得到指定文件夹中的文件,楼主没说要历遍文件夹,所以。。。。。。
发表于 2012-3-22 20:52:49 | 显示全部楼层
回复 10# xms77
那倒是直接用就行,不过首项还是要删,尤其是第二个数组的
发表于 2012-3-22 21:38:22 | 显示全部楼层
回复 9# netegg

【如果指定文件夹不带子文件夹,6楼的就可以,不过需要注意合并数组的时候,要删除数组的首元素】
这个有点不懂...为什么要删除数组的首元素哪?
发表于 2012-3-22 22:20:41 | 显示全部楼层
回复 11# netegg
蛋哥,第二个数组的首元素直接跳过,第一个数组的首元素还是放合并后的数量。
发表于 2012-3-22 22:54:37 | 显示全部楼层
回复 13# xms77
那个首元素要重新算,还不如不加
 楼主| 发表于 2012-3-23 13:50:00 | 显示全部楼层
哈哈, 好多回复 ,谢谢大家哈,其实 我只要 加个分号 就OK了,谢谢谢谢谢谢~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 01:10 , Processed in 0.090691 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表