fuinei 发表于 2012-9-16 13:03:51

[已解决]关于_FileListToArray通配符的问题

本帖最后由 fuinei 于 2012-9-18 16:30 编辑

各位好,AU3的帮忙文件中缺少关于_FileListToArray通配符的内容,百度了一下通配符可使用*表示1个或多个字符,?表示一个任意字符,我有一个疑问题能否通过_FileListToArray列出指定路径下不含特定关键字的文件或文件夹呢?
#include <Array.au3>
#include <File.au3>

Local $Folder = @ScriptDir & "\Test\"
$List = _FileListToArray($Folder,"*.jpg",1)
If $List = 0 Then
        MsgBox(48,"Error","没有找到指定路径或指定的路径中没有jpg文件")
Else
        _ArrayDisplay($List)
EndIf
如上述的代码可返回所有jpg文件的列表,请问如何修改可返回不为jpg文件的列表呢?

半芯竹 发表于 2012-9-16 13:42:06

$List = _FileListToArray($Folder,"*.*",1)


通配符‘*’ 所有的文件

netegg 发表于 2012-9-16 13:59:02

回复 1# fuinei

搜索udf区afan的帖子

xiaowo 发表于 2012-9-16 14:00:44

直接纯_FileListToArray是没办法的

先用_FileListToArray列出所有文件,然后正则匹配凡是.jpg后缀的从数组中删除

得到的就是你想要的了

love5173 发表于 2012-9-16 14:05:03

回复 1# fuinei #include <Array.au3>
#include <File.au3>

Local $Folder = 'D:\MyDoc\MyPic'
$List = _FileListToArray($Folder,"*.*",1)
If $List = 0 Then
      MsgBox(48,"Error","没有找到指定路径或指定的路径中没有文件")
        Else
                For $i=0 To UBound($List)-1
                        While StringRegExp($List[$i],'.*jpg\b')
                                _ArrayDelete($List,$i)
                        WEnd
                        If $i==UBound($List)-1 Then ExitLoop
                        Next
      _ArrayDisplay($List)
EndIf

fuinei 发表于 2012-9-17 10:00:57

回复 5# love5173

使用该代码我运行时有报错,无法返回结果

love5173 发表于 2012-9-17 10:10:44

回复 6# fuinei
如果文件夹内全都是jpg文件的话 会报错,因为根本就没有数组存在
你看看是不是这个原因 因为我在我机器上跑过 正常情况下是可以的

fuinei 发表于 2012-9-17 10:45:36

回复 7# love5173

报错信息如下:
"F:\Pic\test.au3" (12) : ==> ???????????????????.:
WEnd
WEnd^ ERROR

需查找的文件夹中有除jpg以外的1个txt文件,真奇怪~~~

love5173 发表于 2012-9-17 11:30:51

回复 8# fuinei
完善了一下 你试试#include <Array.au3>
#include <File.au3>

Local $Folder = 'D:\UserFile\Desktop\9898'
$List = _FileListToArray($Folder,"*.*",1)
_ArrayDisplay($List)
If $List = 0 Then
      MsgBox(48,"Error","没有找到指定路径或指定的路径中没有文件")
      Else
                For $i=0 To UBound($List)-1
                        While StringRegExp($List[$i],'.*jpg\b')
                              _ArrayDelete($List,$i)
                                                                _ArrayDisplay($List)
                                                                MsgBox(0,$i,UBound($List)-1)
                                                                If $i>=UBound($List) Then ExitLoop 2
                        WEnd
                        If $i>=UBound($List) Then ExitLoop
                        Next
      _ArrayDisplay($List)
EndIf

love5173 发表于 2012-9-17 11:32:07

本帖最后由 love5173 于 2012-9-17 11:33 编辑

错误的原因是数组元素个数变少导致while的时候调用了超出数组的元素,里面的很多语句是为了检测哪里出错才写的,实际用的话可以去掉就行

fuinei 发表于 2012-9-17 18:03:08

回复 10# love5173

测试成功,谢谢指导!

fuinei 发表于 2012-9-17 18:08:12

回复 3# netegg
请问netgee元老指的是 _StringREReplace_Order()吗?

netegg 发表于 2012-9-17 18:28:09

本帖最后由 netegg 于 2012-9-17 18:46 编辑

http://www.autoitx.com/thread-11801-1-2.html
不过需要自己修改下原型

#include <file.au3>
#include <array.au3>
dim $aA = _filelisttoarray(@systemdir, '*.*')
$sA = _arraytostring($aA, @crlf)
$sA = _FileSRER2Line($sA, '.exe', '')
msgbox(0,0,$sA)
;==========================================================================================
; 说明: 按指定的关键字替换或删除文本行,可选择是否使用正则表达式,是否写新文件等。
; 语法: _FileSRER2Line('文件路径'[, '搜索字符'[, '替换'[, 匹配标志[, 正则标志[, 回车符[, 写入标志]]]]]])
; 参数: 可选参数:如'搜索字符'字符为空(默认)则删除所有空行。
;    可选参数:如'替换'字符为空(默认)则删除匹配行,且不会留下空行。
;    可选参数:匹配标志 = 1 :整行需完全匹配(默认);匹配标志 = 0 :行中只需包含关键字。
;    可选参数:使用正则标志 = 1 使用正则(默认),为 0 不使用正则,使用原始字符串匹配。
;    可选参数:回车符标志 = 1 仅识别有回车符的断行@CRLF(默认,速度快),为 0 只要有换行符@LF即识别为断行。
;    可选参数:写入标志 = '' 写入原文件(默认);不为空则写入指定文件;= 0 仅返回不写入。
; 注意: 本函数以行作为操作单位,即不管在一行中含有几处关键字均按一个替换单位操作。
; 返回值:返回替换后的字符串。替换次数保存在@extended宏中。
; 作者: Afan -- http://www.autoitx.com
;=====================================================================================start
Func _FileSRER2Line($sFile, $pattern = '', $replace = '', $flag = 1, $SRE = 1, $CR = 1, $Write = '')
      Local $strqhz = '', $extended = 0, $sRER, $strZY, $CRF = ''
      If $CR = 0 Then $CRF = '?'
      If $pattern = '' Then
                $sRER = StringRegExpReplace(@CRLF & $sFile, '\r' & $CRF & '\n(?=\r' & $CRF & '\n)|\r' & $CRF & '\n$', '')
      Else
                If $SRE = 0 Then
                        $strZY = '(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)'
                        $pattern = StringRegExpReplace($pattern, $strZY, '\\$1')
                        $replace = StringRegExpReplace($replace, $strZY, '\\$1')
                EndIf
                If $flag = 0 Then $strqhz = '\V*'
                Local $patternWZ = $strqhz & $pattern & $strqhz
                $pattern = '(\r' & $CRF & '\n)' & $patternWZ & '(?=\r' & $CRF & '\n)|\r' & $CRF & '\n' & $patternWZ & '$'
                If $replace <> '' Then
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '${1}' & $replace)
                Else
                        $sRER = StringRegExpReplace(@CRLF & $sFile, $pattern, '')
                EndIf
      EndIf
      $extended = $extended + @extended
      $sRER = StringRegExpReplace($sRER, '^\r' & $CRF & '\n', '')
      SetExtended($extended)
      Return $sRER
EndFunc   ;==>_FileSRER2Line

fuinei 发表于 2012-9-18 16:22:11

回复 13# netegg


谢谢指导,函数中还是用到了正则,一定要慢慢学习一下正则
页: [1]
查看完整版本: [已解决]关于_FileListToArray通配符的问题