我有一段代碼,sftp的一個文件。然後我讀取日誌以測試它是否完成。然後我測試該文件以查看它的大小是否大於0kb。完成這些步驟後,我嘗試使用filesystemobject重命名文件。VBA重命名FTP文件後的文件:權限被拒絕
'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個文件在這裏的時間),並能正常工作,如果需要,我可以詳細討論,但我真的不認爲這是問題。
文件大小如下:
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權限被拒絕錯誤。它已經成功地通過了測試,表明它已經完成並且文件的大小大於0.
如果我等幾秒鐘,它總是很好,代碼可以繼續。我真的不想休息幾秒鐘,因爲更大的文件的潛力將意味着它仍然會破壞,我只是浪費時間。
有沒有一種方法可以讓我測試該文件是否仍在被另一個進程使用?如果不是,我可以看到前進的唯一方法是讓我把一個錯誤處理程序放在睡眠和恢復的函數中,如果錯誤= 70,但這在我看來並不理想。
任何想法都會受到感謝。
你用什麼來實際下載文件?你有沒有檢查實際文件的權限? – Comintern
我通過Shell命令使用CoreFTP。它變爲'strFTP =「C:\ Program Files \ CoreFTP \ coreftp.exe -s -delsrc -log C:\ Temp \ ftplog.txt -O -d sftp:// user:pwd @ server:port/filepath -p C:\ temp \「'(我已經用該字符串替換了一些位),然後是'VBA.Shell strFTP,vbMinimizedNoFocus'。 –
來自他們的網站:「在build 1437中,增加了一個名爲corecmd.exe的實用程序以允許阻塞傳輸。使用相同的命令行參數,傳輸將阻塞,直到完成。」你使用阻塞傳輸還是異步傳輸? – Comintern