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

时间:2016-09-13 13:55:20

标签: vba permissions access-vba filesystemobject

我有一段代码,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则恢复,但这在我看来并不理想。

任何想法都会被感激不尽。

1 个答案:

答案 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中的命令行相同(除了它有一些额外的双引号)。