2014-09-24 53 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