2016-11-14 111 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