gpt4 book ai didi

vbscript - 为什么 FileExists 不支持通配符?

转载 作者:行者123 更新时间:2023-12-04 02:08:56 25 4
gpt4 key购买 nike

考虑这个示例 VBScript 片段:

Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists("D:\Folder\File*.ext") Then ' Finds nothing!
fs.CopyFile "D:\Folder\File*.ext", "D:\OtherFolder\"
fs.Deletefile "D:\Folder\File*.ext"
End If

FileExists方法原来不支持通配符(*?)。没有 FolderExists .我希望通配符能够正常工作,因为它们对 FileSystemObject 中的所有类似方法都能正常工作: CopyFile , CopyFolder , MoveFile , MoveFolder , DeleteFile , DeleteFolderGet* 文件名处理方法,如 GetAbsolutePathName .

当然有办法解决这个问题,比如GetFolder并遍历它的文件。但是 FileExists 会更具可读性、方便性、自然性和一致性。

fs.FileExists 不一致感觉像是 API 设计问题。可能是什么原因?它背后有什么想法吗?

最佳答案

只有来自设计 Microsoft Scripting Runtime API (scrrun.dll) 的团队(这些函数是其中的一部分)才能肯定地回答这个问题。

但我的猜测是 FileExists 只不过是 CreateFile Windows API function 的包装器将 dwCreationDisposition 参数设置为 OPEN_EXISTING(“仅当文件或设备存在时才打开它。”)。此 Windows API 函数不支持通配符,因此 FileExists 也不支持。

当文件不存在时,系统将响应错误 2(“系统找不到指定的文件。”)并且 FileExists 将返回 错误

以上内容基于使用 Process Monitor 检查 FileExists 调用的行为。

讨论这是否是 API 设计疏忽以及它是否应该有任何不同是没有意义的。


话虽如此,没有理由在您显示的代码中进行“存在”检查。

如果您想将文件从位置 A 移动到位置 B,只需这样做即可。

如果有东西要移动,它就会被移动。如果没有可移动的东西,就会出现错误,您可以检查。 “存在”检查不提供任何额外信息。

Dim fs, source
Set fs = CreateObject("Scripting.FileSystemObject")

On Error Resume Next

fs.MoveFile "File*.ext", "D:\OtherFolder\"

If Err.Number = 0 Then
MsgBox "Done"
ElseIf Err.Number = 53 Then ' File not found
MsgBox "Nothing to do"
ElseIf Err.Number = 76 Then ' Path not found
MsgBox "Target path not found"
Else
MsgBox "Unexpected Error " & Err.Number & " - " & Err.Description
End If

On Error Goto 0

为方便起见,我将其包装在 Sub 中,以便我可以重新使用它,并且 On Error Resume Next 不会泄漏到我的其余代码中.

还值得注意的是,在同一卷内,MoveFile 将比复制和删除方式快。

关于vbscript - 为什么 FileExists 不支持通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com