Что нового

Проверка скачались ли файлы фтп

artsiom82

Новичок
Сообщения
7
Репутация
0
Добрый день. Подскажите пожалуйста. Использую _FTP_FileGet, есть ли возможность и если есть то как сделать проверку, что файлы из директории скачались, а если не скачались, то перезакачать. Заранее спасибо
 

Glass4217

Осваивающий
Сообщения
174
Репутация
23
сравнить размер?
Код:
_FTP_FileGetSize
 
Автор
A

artsiom82

Новичок
Сообщения
7
Репутация
0
сравнить размер?
Код:
_FTP_FileGetSize
сравнить размер подойдет, если хоть что-то началось качаться, тут проблема, что из 10-ти файлов скачивается только 3 например.
проверяю сейчас так
Код:
$hFtp = _FTP_Open('MyFtp')
$hSession = _FTP_Connect($hFtp, $Host, $Login, $Password)
$aData = _FTP_FindFileFirst($hSession, '', $hFind)
ConsoleWrite('Количество файлов: ' & $aData[0] & @CR)

но количество файлов всегда выдает 11, а должно показывать сколько файлов, что я делаю не так?
 
Последнее редактирование:

Glass4217

Осваивающий
Сообщения
174
Репутация
23
Пожалуйста обрамляйте код в теги [AUTOIT] [/AUTOIT].

Почитал про фтп тут https://autoit-script.ru/threads/poluchenie-dannyx-o-fajle-s-ftp-servera.1070/#post-7686
Мой код не отличается красотой, но похоже что работает. проблема докачки файла решается удалением и новой попыткой. бесконечно.
Код:
#Include <FTPEx.au3>
#Include <WinAPI.au3>

Global Const $Host = "192.168.88.1"
Global Const $Login = "ftpuser"
Global Const $Password = ""
Global Const $s_RemotePath = "disk1/files"
Global Const $localdir = "D:\ftp\"
Global $hFtp, $hSession, $hFind, $aData, $return, $file, $size

$hFtp = _FTP_Open('MyFtp')
$hSession = _FTP_Connect($hFtp, $Host, $Login, $Password)
Global $aData = _FTP_FindFileFirst($hSession, $s_RemotePath, $hFind)
_FTP_DirSetCurrent($hSession, $s_RemotePath)


While Not @error
Ftp($aData[9],$aData[10])                ;основная функция
WEnd
_FTP_FindFileClose($hFind)
_FTP_Close($hFtp)

Func Ftp($size,$file)
   Select
   Case FileExists($localdir&$file) = 0    ;если файла нет
      fileget($file)
   Case FileExists($localdir&$file) = 1    ;если файл есть
      checkfile($size,$file)
   Case Else                            ;на случай землетрясения
   ConsoleWrite("чтото пошло не так"& @CR)
EndSelect
EndFunc

Func fileget($file)                        ;функция скачивания файла
   _FTP_FileGet($hSession, $file, $localdir&$file, True)
   Sleep(100)
EndFunc

Func checkfile($size,$file)                ;проверка скачивания файла
   ConsoleWrite("Размер файла на фтп " &$size & @CR)
   $size2 = FileGetSize ($localdir&$file)
   ConsoleWrite("Размер файла локально "&$size2 & @CR)
   if $size = $size2 Then                ;сравнение размеров
      ConsoleWrite($file &@TAB&" скачан полностью" & @CR)
      $aData = _FTP_FindFileNext($hFind);переключение на новый файл
      If @error Then Exit                ;если файлов больше нет выходим из цикла
   Else
      ConsoleWrite($file &@TAB&" ошибка скачивания файла" & @CR)
      FileDelete($localdir&"\"&$file)    ;удаляем недокачаный файл
      Sleep(100)
      ConsoleWrite("Пытаюсь снова скачать файл "&$file&" в "& $localdir&$file & @CR)
      fileget($file)
   EndIf
EndFunc
 
Последнее редактирование:
Автор
A

artsiom82

Новичок
Сообщения
7
Репутация
0
то, что надо отлично, но небольшая проблема, после скачивания с этими файлами нужно ещё поработать(перенести в папку)
Код:
If @error Then Exit
а вот эта строка полностью завершает код, можно её на что нибудь поменять?
 

Glass4217

Осваивающий
Сообщения
174
Репутация
23
а вот эта строка полностью завершает код, можно её на что нибудь поменять?
да это строка срабатывает когда _FTP_FindFileNext не может получить имя следующего файла.
заменить можно например на призыв следующей функции
Код:
Func checkfile($size,$file)                ;проверка скачивания файла
   ConsoleWrite("Размер файла на фтп " &$size & @CR)
   $size2 = FileGetSize ($localdir&$file)
   ConsoleWrite("Размер файла локально "&$size2 & @CR)
   if $size = $size2 Then                ;сравнение размеров
      ConsoleWrite($file &@TAB&" скачан полностью" & @CR)
      $aData = _FTP_FindFileNext($hFind);переключение на новый файл
     If @error Then workinfile()               
   Else
      ConsoleWrite($file &@TAB&" ошибка скачивания файла" & @CR)
      FileDelete($localdir&"\"&$file)    ;удаляем недокачаный файл
      Sleep(100)
      ConsoleWrite("Пытаюсь снова скачать файл "&$file&" в "& $localdir&$file & @CR)
      fileget($file)
   EndIf
EndFunc

Func workinfile()
ConsoleWrite("пишем новую функцию"& @CR)
EndFunc
 
Автор
A

artsiom82

Новичок
Сообщения
7
Репутация
0
если делать переход как Вы написали, то при выполнении пишет ошибку
Код:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
Ftp($aData[9],$aData[10])
 

Glass4217

Осваивающий
Сообщения
174
Репутация
23
Блин, точно! Сделал вставку без проверки кода. Меня кот заразил и теперь тоже лапки.
Немного перешаманил на пару с котом. за основу взял _FTP_ListToArray
Код:
#Include <FTPEx.au3>
#Include <WinAPI.au3>

Global Const $Host = "192.168.88.1"
Global Const $Login = "ftpuser"
Global Const $Password = ""
Global Const $s_RemotePath = "disk1/files"
Global Const $localdir = "D:\ftp\"
Global $hFtp, $hSession, $hFind, $aData, $return = 0, $file, $sizeFTP, $sizeLocal

Func FTP_Close()                        ;закрытие сессии фтп
   _FTP_FindFileClose($hFind)
   _FTP_Close($hFtp)
EndFunc

Func Check_Local_Dir()                    ;проверка наличия каталога
   Select
   Case FileExists($localdir) = 0        ;каталога нет
      ConsoleWrite("Каталога нет, создаю"& @CR)
      DirCreate($localdir)
   Case FileExists($localdir) = 1        ;каталог есть
      ConsoleWrite("Каталог есть"& @CR)
   Case Else                              ;на случай землетрясения
      ConsoleWrite("ошибка проверки наличия локального каталога"& @CR)
   EndSelect
EndFunc

Func FTP_Open()                            ;открытие сессии фтп
   $hFtp = _FTP_Open('MyFtp')
   $hSession = _FTP_Connect($hFtp, $Host, $Login, $Password)
   _FTP_DirSetCurrent($hSession, $s_RemotePath)
   Global $aData = _FTP_ListToArray($hSession, 2)    ;список файлов пихаем в архив
   If @error Then Exit                    ;нет файлов в каталоге
      ConsoleWrite ($aData[0]& " файлов на фтп" & @CR)
   For $a = 1 To $aData[0]
      Local_File_Check($aData[$a])
   Next
EndFunc

Func FTP_Copy_File($file,$sleep)        ;Скачивание файла с фтп в локальный каталог
   ConsoleWrite("Качаем файл на локальный пк"& @CR)
   _FTP_FileGet($hSession, $file, $localdir&$file, True)
   Sleep($sleep)
   Local_File_Check($file)
EndFunc

Func Local_File_Check($file)            ;Проверка наличия файла в локальном каталоге
   ConsoleWrite("проверяем наличие файла "&$file& " в локальном каталоге"& @CR)
   Select
   Case FileExists($localdir&$file) = 0    ;если файла нет
      ConsoleWrite("нет файла "&$file&" в локальном каталоге"& @CR)
      FTP_Copy_File($file,1000)
   Case FileExists($localdir&$file) = 1    ;если файл есть
      ConsoleWrite("есть файл "&$file&" в локальном каталоге"& @CR)
      FTP_and_local_size_file($file)
   Case Else                            ;на случай землетрясения
      ConsoleWrite("ошибка проверки наличия файлов в локальном каталоге"& @CR)
   EndSelect
EndFunc

Func FTP_and_local_size_file($file)        ;Сравниваем размер файлов в локальном каталоге и на фтп.
         $sizeFTP = _FTP_FileGetSize($hSession, $file)
      ConsoleWrite("Размер файла на фтп "&$sizeFTP& @CR)
      $sizelocal = FileGetSize($localdir&$file)
      ConsoleWrite("Размер файла в локальном каталоге "&$sizelocal& @CR)

      If $sizeFTP = $sizelocal Then
         ConsoleWrite("Файл "&$file&" имеет один размер, скачивание удалось"& @CR)
      Else
         ConsoleWrite("Файл "&$file&" имеет разный размер, скачивание не удалось"& @CR)
         FileDelete($localdir&"\"&$file)    ;удаляем недокачаный файл
         Select
         Case    $return < 5                ;даем 5 секунд задержки
            FTP_Copy_File($file,5000)
            $return = $return + 1
         Case    $return < 10            ;даем 10 секунд задержки
            FTP_Copy_File($file,10000)
            $return = $return + 1
         Case Else
            ConsoleWrite("Файл не хочет докачиваться, возможно нужно увеличить время на скачивание."& @CR)
         EndSelect
         #cs
;~          FTP_Copy_File($file,10000) ;можно убрать Select - EndSelect и раскоментировать эту команду, тогда попытки скачать файл никогда не закончатся.
         #ce
      EndIf
EndFunc

Check_Local_Dir()
FTP_Open()
FTP_Close()

Newfunc()

Func Newfunc()
   MsgBox(1, "MyFtp", "Все файлы скачаны, чо делаем дальше?")

EndFunc


Но вот что делать если файл не качается совсем, я пока не придумал, к сожалению я не знаю как можно проверить такое, свой FTP я поднял на роутере, специально для этой задачи. других серверов не знаю)
 
Последнее редактирование:
Автор
A

artsiom82

Новичок
Сообщения
7
Репутация
0
как раз проблема в том, что файл не качается совсем, в этом то и проблема... в любом случае спасибо :smile:
я думаю в сторону: после скачивания проверить сколько файлов в папке и сколько файлов на фтп, если не совпадает, то перекачать, но не могу найти, что отдает количество файлов на фтп
 
Последнее редактирование:

Glass4217

Осваивающий
Сообщения
174
Репутация
23
Верх