我有一段代码,sftp是一个文件。然后我读取日志以测试它是否已完成。然后我测试文件,看它的大小是否大于0kb。完成这些步骤后,我尝试使用filesystemobject重命名该文件。以下代码的摘录:
'Wait for FTP to complete
Do While Not (bSFTPDownloadComplete(strLogFile))
Sleep 2000
Loop
'Wait for file to not be 0KB
Do Until FileSize(strFile) > 0
Sleep 2000
Loop
'Move file to filename
RenameFile strFile, strNewFile
bSFTPDownloadComplete
正在阅读内容并测试“已下载的文件总数:1”(我这里一次只下载1个文件)这个工作正常,如果需要,我可以详细介绍我真的不认为这是问题。
FileSize 如下:
Function FileSize(strPath As String) As Double
Dim fso As FileSystemObject
FileSize = 0
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(strPath) Then
FileSize = fso.GetFile(strPath).size
End If
Set fso = Nothing
End Function
RenameFile 如下:
Function RenameFile(strOrig As String, strNew As String)
Dim fso As FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile strOrig, strNew
Set fso = Nothing
End Function
在非常大的文件上,我在fso.MoveFile
行上收到运行时70权限被拒绝错误。它已成功通过ftp日志表明已完成并且文件大小大于0的测试。
如果我再等几秒钟,它总是很好,代码可以继续。我真的不想睡几秒钟,因为更大的文件可能意味着它仍然会破坏,我只是浪费时间。
我有办法测试该文件是否仍在被其他进程使用吗?如果不是我能看到前进的唯一方法是让我在休眠的函数中放置一个错误处理程序,如果错误= 70则恢复,但这在我看来并不理想。
任何想法都会被感激不尽。
答案 0 :(得分:0)
好的,我知道了。而不是基于文件大小,我正在检查coreftp.exe是否仍然作为一个进程打开:
'Check for coreftp.exe to close - Command line should match strFTP
Do While bCoreFTPRunning(strFTP)
Sleep 2000
Loop
使用的功能如下:
Function bCoreFTPRunning(strFTP As String) As Boolean
Dim objWMIService, colProcessList, objProcess, i As Integer
bCoreFTPRunning = False
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'coreftp.exe'")
For Each objProcess In colProcessList
If Replace(objProcess.commandline, Chr(34), "") = strFTP Then
bCoreFTPRunning = True
End If
Next
Set objWMIService = Nothing
Set colProcessList = Nothing
End Function
该过程中的命令行与strFTP中的命令行相同(除了它有一些额外的双引号)。