2014-09-24 55 views
0

這裏是scenerio,我在「FilestoMerge」目錄中有一些文本文件。我使用VbScript來遍歷目錄中的每個文件,並將內容合併到「Output」目錄中的一個'output.txt'文件中。之後,合併成功,我想刪除原始文件。如何確保父文件中的內容是否已成功寫入輸出文件,然後再刪除它。下面是我的Vbscript合併文件。如何確保輸出文件已成功寫入VbScript中?

Set fso = CreateObject("Scripting.FileSystemObject") 


set OutputFile = fso.CreateTextFile(strOutputFileName) 
Set WMIService = GetObject("winmgmts:\\" & "." & "\root\cimv2") 

Set FileList = WMIService.ExecQuery _ 
("ASSOCIATORS OF {Win32_Directory.Name='C:\Users\xxxx\yyyy\FilesToMerge'} Where " _ 
    & "ResultClass = CIM_DataFile") 

For Each file In FileList 
    Set objTextFile = fso.OpenTextFile(file.Name, ForReading) 
    strText = objTextFile.ReadAll 
    objTextFile.Close 
    OutputFile.WriteLine strText <<<<need to make sure this is successfull, then only delete 
    fso.DeleteFile(file.Name) 
Next 

OutputFile.Close 
+0

有沒有一個它不成功的場合?我認爲它失敗的唯一原因是如果該命令在打開文件時發生錯誤。我不認爲'.WriteLine'返回任何東西,所以沒有什麼可以獲得的。如果線路成功,我認爲沒有理由認爲它失敗。 – Matt 2014-09-24 02:38:17

+0

@Matt感謝您的回覆。我認爲你是對的,不可能出現寫作失敗的情況,除非如你所說,這個文件正在被另一個進程使用。現在我有一個問題 - 如果我的腳本要讀取的文件實際上是由另一個進程寫入的,並且尚未完成,因爲它是一個大約50 MB的大文件,那麼會發生什麼? – Praati 2014-09-26 00:34:07

+0

如果該文件已經在另一個進程中打開,則嘗試打開該文件會導致可能需要處理的異常,如果這是可行的話。如果你在問題的使用者的地址中使用'On Error'部分,你的答案將會有所幫助。 – Matt 2014-09-26 02:08:57

回答

0

你可以做一些錯誤檢查:

On Error Resume Next 
For Each file In FileList 
    Set objTextFile = fso.OpenTextFile(file.Name, ForReading) 
    strText = objTextFile.ReadAll 
    objTextFile.Close 
    If Err Then 
     ' There's been an error reading the file 
     ' Handle in some way 
     Err.Clear ' Clear error 
    End If 
    OutputFile.WriteLine strText <<<<need to make sure this is successfull, then only delete 
    If Err Then 
     ' There's been an error writing the read content to the output file 
     ' Handle in some way 
     Err.Clear 
    End If 
    fso.DeleteFile(file.Name) 
Next 
On Error GoTo 0 

您還可以在前三行的讀取操作合併成一條線:

strText = fso.OpenTextFile(file.Name, ForReading).ReadAll 

無需打開,閱讀和關閉,如果你想要做的只是一次性讀取文件的內容。

::編輯::

退一步上述結構將是危險的,因爲你可能會處理讀取錯誤,然後去寫的變量(這將是空的內容,由於讀取錯誤)成功輸出到輸出文件,然後刪除原始文件,因爲寫入文件時不會出錯。所以使用下面的結構:

On Error Resume Next 
For Each file In FileList 
    strText = fso.OpenTextFile(file.Name, ForReading).ReadAll 
    If Err Then 
     ' There's been an error reading the file 
     ' Handle in some way 
     Err.Clear ' Clear error 
    Else 
     OutputFile.WriteLine strText 
     If Err Then 
      ' There's been an error writing the read content to the output file 
      ' Handle in some way 
      Err.Clear 
     Else 
      fso.DeleteFile(file.Name) 
     End If 
    End If 
Next 
On Error GoTo 0 

這隻會嘗試寫入該文件,如果沒有發生過的錯誤讀它,只會嘗試刪除該文件,如果沒有發生過的錯誤寫入OutputFile

+0

非常感謝您的回答。所以,這意味着,如果發生錯誤,它會轉到錯誤處理代碼並進入下一個循環,而不會在錯誤之後執行代碼?例如,如果在以前的代碼行中發生錯誤,fso.delete()將不會執行?另外,我可以寫如 - 如果錯誤然後*處理錯誤*其他fso.Delete? – Praati 2014-09-26 00:37:52

+0

在vbscript中傳遞錯誤是非常基本的。 'On Error Resume Next'簡單地告訴它在發生錯誤時繼續下一行/語句,而不是立即以運行時錯誤退出。然後,您必須在代碼中的適當位置檢查錯誤 - 我在讀取和寫入後進行了錯誤檢查。如果在發生錯誤後除了退出以外的任何其他操作,那麼在確認錯誤之後,您需要使用Err.Clear()清除錯誤,否則錯誤代碼將保留,您的下次錯誤檢查將再次提取錯誤。 – eurotrash 2014-09-26 06:23:28

+0

在我的示例中,會執行'fso.Delete()',因爲錯誤是在If If語句中處理的,然後繼續執行下一條語句,即fso.DeleteFile ()'。最後是的,你可以做'如果錯誤然後_handle error_ Else fso.Delete',如果你不想在發生錯誤時刪除文件,這將是一個好主意。例如,你可以做一些事情,如'如果錯誤那麼''WScript.Echo「寫入文件時出錯:」&Err.Description''Err.Clear'' Else'' fso.DeleteFile(File。路徑)''End If' – eurotrash 2014-09-26 06:31:21