为什么FileExists不支持通配符?
考虑这个例子的VBScript片段:为什么FileExists不支持通配符?
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
。我预计wildards只是工作,因为他们工作的优良在FileSystemObject
所有类似的方法:CopyFile
,CopyFolder
,MoveFile
,MoveFolder
,DeleteFile
,DeleteFolder
和Get*
文件名处理方法一样GetAbsolutePathName
。
当然有办法解决这个问题,像GetFolder
并遍历其文件。但FileExists
会更可读,方便,自然和一致。
的fs.FileExists
不一致的感觉就像一个API设计问题。可能是什么原因?背后有一些想法吗?
仅从所设计的Microsoft脚本运行时API(的scrrun.dll),这些功能的一部分的团队有人,可以回答是肯定的这个问题。
但我的猜测是,FileExists
不过对于CreateFile
Windows API function与dwCreationDisposition
参数设置为OPEN_EXISTING
包装(“打开文件或仅如果它存在的设备。”)。此Windows API函数不支持通配符,因此FileExists
也不支持。
当文件不存在,系统将错误响应2(“系统找不到指定的文件。”)和FileExists
将返回False
。
上面是基于使用进程监视器检查一个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
将是方式比复制和删除更快。
@MicheldeRuiter我会推荐On Error方法,因为还有很多可能会出错的内容,比如只读权限,没有权限,锁定文件,路径太长等等。 – Slai
'FileExists'之前显示我的意图要好得多事实之后比'Err.Number = 53'。当然,我确实有错误处理。 'CopyFile'加'DeleteFile'只是为了显示两者的例子。 –
是的,但由于你的进程不是这台计算机上唯一的进程,所以在成功进行“文件存在”检查后,该文件可能会在毫秒内消失(想象一下,由于某种愚蠢的原因,脚本的两个实例同时运行,或许多其他情况)。重点是,除非你保持文件句柄打开(并且因此防止任何人在你完成文件之前拿走你的文件),否则文件存在检查真的没有意义。对于尝试执行任何操作并处理错误,比依赖文件存在检查并处理没有错误更加稳健。 – Tomalak
另一个解决方法是'如果Dir(“D:\ Folder \ File * .ext”)>“”Then'或者某些DOS命令 – Slai
@Slai'Dir'在VBScript中不存在。 – Tomalak