2016-09-13 67 views
1

我有一段代碼,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,但這在我看來並不理想。

任何想法都會受到感謝。

+0

你用什麼來實際下載文件?你有沒有檢查實際文件的權限? – Comintern

+0

我通過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'。 –

+0

來自他們的網站:「在build 1437中,增加了一個名爲corecmd.exe的實用程序以允許阻塞傳輸。使用相同的命令行參數,傳輸將阻塞,直到完成。」你使用阻塞傳輸還是異步傳輸? – Comintern

回答

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一樣(除了它有一些額外的雙引號外)。