找回密码
 加入
搜索
查看: 12673|回复: 27

[AU3基础] 【已解决】如何判断多个文件或文件夹存在与否

 火... [复制链接]
发表于 2012-8-6 21:58:01 | 显示全部楼层 |阅读模式
本帖最后由 虎虎虎 于 2012-8-8 18:56 编辑

如题:
使用FileExists只能判断单个文件,坛子里搜索不到相关函数或例子。
发表于 2012-8-6 22:23:31 | 显示全部楼层
自己封装一个 啦

#include <Array.au3>
Local $a[4] = [3, "C:\boot.ini", "C:\WINDOWS", "C:\bootmgr"]
Local $b = FileOrFolderExists($a)
_ArrayDisplay($a)
_ArrayDisplay($b)

Func FileOrFolderExists(ByRef $a)
        Local $status = ""
        Local $i
        For $i = 1 To $a[0]-1
                If FileExists($a[$i]) Then
                        $status &= "存在" & "|"
                Else
                        $status &= "不存在" & "|"
                EndIf
        Next
        If FileExists($a[$i]) Then
                $status &= "存在"
        Else
                $status &= "不存在"
        EndIf
        Return StringSplit($status, "|")
EndFunc

评分

参与人数 1金钱 +10 收起 理由
虫子樱桃 + 10 热心

查看全部评分

 楼主| 发表于 2012-8-6 22:37:56 | 显示全部楼层
楼上的是数组吗?有没有简单些的啊,还不是很理解数组
发表于 2012-8-6 23:03:01 | 显示全部楼层
回复 3# 虎虎虎


    2楼代码很好啊  
Local $a[5] = [3,"C:\boot.ini", "C:\WINDOWS", "C:\bootmgr","E:\工作目录"];这样子山寨一下就变成您的版本了。就是说把你要检测的写在第二个括号里,不过要记得没写一个地一个括号就要自己加大1哦
发表于 2012-8-6 23:05:35 | 显示全部楼层
回复 2# veket_linux


    前辈   可以指点下   元素中的  3  是什么吗?
 楼主| 发表于 2012-8-6 23:41:27 | 显示全部楼层
据我了解到的是,数组,必须留一位给gui,不然不显示窗体。3+1=4
发表于 2012-8-7 01:06:58 | 显示全部楼层
回复  veket_linux


    前辈   可以指点下   元素中的  3  是什么吗?
魔导 发表于 2012-8-6 23:05



    3是该数组包含多少条需要检测的目录或文件,就像是stringsplit返回的$array[0]拆分后子串的数量
所以应该改为
Local $a[5] = [4,"C:\boot.ini", "C:\WINDOWS", "C:\bootmgr","E:\工作目录"];这样子山寨一下就变成您的版本了。就是说把你要检测的写在第二个括号里,不过要记得没写一个地一个括号就要自己加大1哦
发表于 2012-8-7 08:53:28 | 显示全部楼层
对 FileOrFolderExists(ByRef $a)中的ByRef还是不能理解,自已也看过解释,形参,实参,我什么时候才能顿悟啊!!!
发表于 2012-8-7 09:00:20 | 显示全部楼层
我个人还是喜欢用AND。。。。呵呵。。。
发表于 2012-8-7 11:08:27 | 显示全部楼层
解决这类问题必须学会写自定义函数。
;例子:
#include <Array.au3>
Local $a[3] = ['C:\boot.ini', 'C:\WINDOWS', 'C:\Documents and Settings']
Local $rt = _FilesExists($a) ;检查数组例子
MsgBox(0, @Error, '全部存在返回1,否则返回0' & @LF & $rt)
$rt = _FilesExists('C:\boot.ini |C:\WINDOWS | C:\Documents and Settings') ;检查字符串例子
MsgBox(0, @Error, '全部存在返回1,否则返回0' & @LF & $rt)
$rt = _FilesExists('C:\boot.ini |C:\WINDOWS111 | C:\Documents and Settings111', 1) ;返回不存在的文件数组例子
_ArrayDisplay($rt, '不存在的文件')

Func _FilesExists($Files, $Flag = 0, $aF = 0)
        ;Afan 提示:检查多个文件是否存在
        ;$Files - 需检查的文件,可以是字符串或1维数组:
        ;    为字符串时,多个文件用“|”分隔
        ;    为数组时,每个元素为一个文件,同时第三个参数$aF可用
        ;$aF - 为数组时,检查的起始元素,默认为0
        ;$Flag - 需返回的结果标志。
        ;返回值:
        ;    正确 - 根据$Flag的值返回结果:
        ;       $Flag=0(默认)        全部存在返回1,否则返回0
        ;       $Flag=1                全部存在返回1,否则返回不存在的文件数组
        ;    错误 - 设置@Error非零

        Local $aTmp = $Files, $Start = 0
        If IsArray($Files) Then ;文件数组
                If UBound($Files, 0) > 1 Then Return SetError(1)
                If UBound($Files) < $aF Then Return SetError(2)
                $Start = $aF
        Else ;文件字符串
                $aTmp = StringRegExp($Files, '([^|\s][^|]+[^|\s])', 3)
                If @error Then Return SetError(3)
        EndIf
        If $Flag Then
                Local $sTmp = ''
                For $i = $Start To UBound($aTmp) - 1
                        If Not FileExists($aTmp[$i]) Then $sTmp &= $aTmp[$i] & '|'
                Next
                If $sTmp = '' Then Return 1
                Local $aSR = StringRegExp($sTmp, '[^|]+', 3)
                Return $aSR ;返回不存在的文件数组
        EndIf
        For $i = $Start To UBound($aTmp) - 1
                If Not FileExists($aTmp[$i]) Then Return 0
        Next
        Return 1
EndFunc   ;==>_FilesExists

评分

参与人数 1金钱 +10 收起 理由
happytc + 10 A版永远都是那么热心快捷呀!

查看全部评分

发表于 2012-8-7 11:10:21 | 显示全部楼层
我个人还是喜欢用AND。。。。呵呵。。。
boyhong 发表于 2012-8-7 09:00


我觉得也是啊
发表于 2012-8-7 12:58:37 | 显示全部楼层
回复 7# zch11230


    哦,是这样子的啊    多谢多谢
 楼主| 发表于 2012-8-7 16:08:44 | 显示全部楼层
参考楼上各位代码模仿的代码,测试没问题,不知是否是这样描述。


#include <Array.au3>

Local $Dir[3] = [2, @AppDataDir & "\360Login", @AppDataDir & "\360SE"]
Local $i

 For $i = 1 To $Dir[0]-1
         
         Next 
If FileExists($Dir[$i]) Then
        
        Switch MsgBox(0, "测试", _
                 "存在", _
                 0)
    Case 1
     EndSwitch
else

        
        
        Switch MsgBox(0, "测试", _
                 "不存在", _
                 0)
    Case 1
EndSwitch

endif

发表于 2012-8-7 17:38:30 | 显示全部楼层
只能说 LZ 两年来白学了。惨不忍睹。
发表于 2012-8-7 18:59:45 | 显示全部楼层
看到a版回复,我笑了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 06:51 , Processed in 0.089338 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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