虎虎虎 发表于 2012-8-6 21:58:01

【已解决】如何判断多个文件或文件夹存在与否

本帖最后由 虎虎虎 于 2012-8-8 18:56 编辑

如题:
使用FileExists只能判断单个文件,坛子里搜索不到相关函数或例子。

veket_linux 发表于 2012-8-6 22:23:31

自己封装一个 啦

#include <Array.au3>
Local $a =
Local $b = FileOrFolderExists($a)
_ArrayDisplay($a)
_ArrayDisplay($b)

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

虎虎虎 发表于 2012-8-6 22:37:56

楼上的是数组吗?有没有简单些的啊,还不是很理解数组

魔导 发表于 2012-8-6 23:03:01

回复 3# 虎虎虎


    2楼代码很好啊
Local $a = ;这样子山寨一下就变成您的版本了。就是说把你要检测的写在第二个括号里,不过要记得没写一个地一个括号就要自己加大1哦

魔导 发表于 2012-8-6 23:05:35

回复 2# veket_linux


    前辈   可以指点下   元素中的3是什么吗?

虎虎虎 发表于 2012-8-6 23:41:27

据我了解到的是,数组,必须留一位给gui,不然不显示窗体。3+1=4

zch11230 发表于 2012-8-7 01:06:58

回复veket_linux


    前辈   可以指点下   元素中的3是什么吗?
魔导 发表于 2012-8-6 23:05 http://www.autoitx.com/images/common/back.gif


    3是该数组包含多少条需要检测的目录或文件,就像是stringsplit返回的$array拆分后子串的数量
所以应该改为Local $a = ;这样子山寨一下就变成您的版本了。就是说把你要检测的写在第二个括号里,不过要记得没写一个地一个括号就要自己加大1哦

32714107 发表于 2012-8-7 08:53:28

对 FileOrFolderExists(ByRef $a)中的ByRef还是不能理解,自已也看过解释,形参,实参,我什么时候才能顿悟啊!!!

boyhong 发表于 2012-8-7 09:00:20

我个人还是喜欢用AND。。。。呵呵。。。

afan 发表于 2012-8-7 11:08:27

解决这类问题必须学会写自定义函数。;例子:
#include <Array.au3>
Local $a = ['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

ac5474012 发表于 2012-8-7 11:10:21

我个人还是喜欢用AND。。。。呵呵。。。
boyhong 发表于 2012-8-7 09:00 http://www.autoitx.com/images/common/back.gif

我觉得也是啊

魔导 发表于 2012-8-7 12:58:37

回复 7# zch11230


    哦,是这样子的啊    多谢多谢

虎虎虎 发表于 2012-8-7 16:08:44

参考楼上各位代码模仿的代码,测试没问题,不知是否是这样描述。


#include <Array.au3>

Local $Dir =
Local $i

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

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

endif

afan 发表于 2012-8-7 17:38:30

只能说 LZ 两年来白学了。惨不忍睹。

drunk 发表于 2012-8-7 18:59:45

看到a版回复,我笑了{:face (197):}
页: [1] 2
查看完整版本: 【已解决】如何判断多个文件或文件夹存在与否