2016-09-13 4 views
1

У меня есть фрагмент кода, который sftp записывает файл. Затем я прочитал журнал, чтобы проверить, завершено ли оно. Затем я тестирую файл, чтобы узнать, больше ли он размером 0 КБ. По завершении этих шагов я попытаюсь переименовать файл с помощью файла 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 файл за раз здесь) и это работает отлично, Если потребуется, я могу углубиться в подробности, но я действительно не думаю, что это проблема.


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 

На очень ла rge files Я получаю сообщение об отказе во время выполнения 70 на строке fso.MoveFile. Он успешно прошел проверку, что протокол ftp говорит, что он завершен, а размер файла больше 0.

Если я потом подожду несколько секунд, это всегда нормально, и код может продолжаться. Я действительно не хочу спать в течение нескольких секунд, так как потенциал для еще больших файлов будет означать, что он все равно сломается, и я просто теряю время.

Есть ли способ проверить, используется ли файл другим процессом? Если не единственный способ, с которым я могу идти, это заставить обработчик ошибок в функции, которая спит и возобновляется, если err = 70, но это не кажется идеальным в моей голове.

Любые идеи были бы с благодарностью получены.

+0

Что вы используете, чтобы загрузить файл? Вы еще проверили разрешения для фактического файла? – Comintern

+0

Я использую CoreFTP через команду Shell. Это идет '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

На своем веб-сайте: «В сборке 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 (кроме того, у него есть дополнительные двойные кавычки).