找回密码
 加入
搜索
查看: 6555|回复: 13

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

  [复制链接]
发表于 2012-9-16 13:03:51 | 显示全部楼层 |阅读模式
本帖最后由 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) 


通配符‘*’ 所有的文件
发表于 2012-9-16 13:59:02 | 显示全部楼层
回复 1# fuinei

搜索udf区afan的帖子
发表于 2012-9-16 14:00:44 | 显示全部楼层
直接纯_FileListToArray是没办法的

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

得到的就是你想要的了
发表于 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

评分

参与人数 1金钱 +10 收起 理由
xiaowo + 10 我很赞同

查看全部评分

 楼主| 发表于 2012-9-17 10:00:57 | 显示全部楼层
回复 5# love5173

使用该代码我运行时有报错,无法返回结果
发表于 2012-9-17 10:10:44 | 显示全部楼层
回复 6# fuinei
如果文件夹内全都是jpg文件的话 会报错,因为根本就没有数组存在
你看看是不是这个原因 因为我在我机器上跑过 正常情况下是可以的
 楼主| 发表于 2012-9-17 10:45:36 | 显示全部楼层
回复 7# love5173

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

需查找的文件夹中有除jpg以外的1个txt文件,真奇怪~~~
发表于 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
发表于 2012-9-17 11:32:07 | 显示全部楼层
本帖最后由 love5173 于 2012-9-17 11:33 编辑

错误的原因是数组元素个数变少导致while的时候调用了超出数组的元素,里面的很多语句是为了检测哪里出错才写的,实际用的话可以去掉就行
 楼主| 发表于 2012-9-17 18:03:08 | 显示全部楼层
回复 10# love5173

测试成功,谢谢指导!
 楼主| 发表于 2012-9-17 18:08:12 | 显示全部楼层
回复 3# netegg
请问netgee元老指的是 _StringREReplace_Order()吗?
发表于 2012-9-17 18:28:09 | 显示全部楼层
本帖最后由 netegg 于 2012-9-17 18:46 编辑

http://www.autoitx.com/thread-11801-1-2.html
不过需要自己修改下原型
[au3]
#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[/au3]
 楼主| 发表于 2012-9-18 16:22:11 | 显示全部楼层
回复 13# netegg


谢谢指导,函数中还是用到了正则,一定要慢慢学习一下正则
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-20 18:38 , Processed in 0.081974 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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