VBA 在 FTP 之后重命名文件:权限被拒绝

VBA Rename file after FTP: permission denied

我有一段代码在 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 正在阅读 "Total downloaded files: 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

重命名文件如下:

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 行收到 运行-Time 70 Permission Denied 错误。已成功通过ftp日志说已完成且文件大小大于0的测试

如果我再等几秒钟,它总是没问题,代码可以继续。我真的不想睡几秒钟,因为更大文件的可能性意味着它仍然会中断,我只是在浪费时间。

有没有办法让我测试文件是否仍在被另一个进程使用?如果不是的话,我能看到的唯一方法是在函数中放置一个错误处理程序,如果 err = 70,它会休眠并恢复,但这在我看来并不理想。

如有任何想法,我们将不胜感激。

好的,我知道了。我不是基于文件大小,而是检查 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 相同(除了它有一些额外的双引号)。