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 相同(除了它有一些额外的双引号)。
我有一段代码在 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 相同(除了它有一些额外的双引号)。