У меня есть фрагмент кода, который 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, но это не кажется идеальным в моей голове.
Любые идеи были бы с благодарностью получены.
Что вы используете, чтобы загрузить файл? Вы еще проверили разрешения для фактического файла? – Comintern
Я использую 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'. –
На своем веб-сайте: «В сборке 1437 была добавлена утилита с именем corecmd.exe, позволяющая блокировать передачи. Используйте те же параметры линии связи, что и ваши передачи, которые будут заблокированы до завершения». Используете ли вы блокирующую передачу или асинхронную? – Comintern