2016-11-14 44 views
2

考虑这个例子的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所有类似的方法:CopyFileCopyFolderMoveFileMoveFolderDeleteFileDeleteFolderGet*文件名处理方法一样GetAbsolutePathName

当然有办法解决这个问题,像GetFolder并遍历其文件。但FileExists会更可读,方便,自然和一致。

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

+0

另一个解决方法是'如果Dir(“D:\ Folder \ File * .ext”)>“”Then'或者某些DOS命令 – Slai

+1

@Slai'Dir'在VBScript中不存在。 – Tomalak

回答

5

仅从所设计的Microsoft脚本运行时API(的scrrun.dll),这些功能的一部分的团队有人,可以回答是肯定的这个问题。

但我的猜测是,FileExists不过对于CreateFile Windows API functiondwCreationDisposition参数设置为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将是方式比复制和删除更快。

+2

@MicheldeRuiter我会推荐On Error方法,因为还有很多可能会出错的内容,比如只读权限,没有权限,锁定文件,路径太长等等。 – Slai

+0

'FileExists'之前显示我的意图要好得多事实之后比'Err.Number = 53'。当然,我确实有错误处理。 'CopyFile'加'DeleteFile'只是为了显示两者的例子。 –

+1

是的,但由于你的进程不是这台计算机上唯一的进程,所以在成功进行“文件存在”检查后,该文件可能会在毫秒内消失(想象一下,由于某种愚蠢的原因,脚本的两个实例同时运行,或许多其他情况)。重点是,除非你保持文件句柄打开(并且因此防止任何人在你完成文件之前拿走你的文件),否则文件存在检查真的没有意义。对于尝试执行任何操作并处理错误,比依赖文件存在检查并处理没有错误更加稳健。 – Tomalak