Что нового

[Сеть, интернет] Скачивание файла с FTP с меняющимся URL

Mark

Новичок
Сообщения
22
Репутация
1
Доброго времени.
Мне необходимо периодически скачивать с ФТП сервера, обновления для софта.
Линк на обновление выглядит так:
ftp://site.com/update/soft_[date]/ver.rar
К примеру, сегодня он называется
ftp://site.com/update/soft_250110/ver.rar
Тег "soft_" стабилен. Меняется только дата.
Как это реализовать на AutoIt?
Варианты типа:
Код:
InetGet("ftp://site.com/update/soft_******/ver.rar", "ver.rar", 0, 0)

Ничего не дали.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
А можно поточнее, каков точный формат даты?
010110? (1 янв например). в смысле возглавляющие нули точно есть?
Код:
$date = @MDAY & @MON & StringRight(@YEAR, 2)
;MsgBox(0, '', $date)
InetGet("ftp://site.com/update/soft_" & $date & "/ver.rar", "ver.rar", 8)
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Формат даты [Дата:месяц:год] [XX:YY:ZZ]
Есть одно, но. Привязывать к текущей дате не вариант.
Обновление от сегодняшнего числа может быть сегодня не скачано. Или разработчики выложат новую версию сегодня, но очень поздно и скачается она только завтра и дата будет другая.

Алгоритм должен быть такой.
1. Соединился с ftp://site.com/update/
2. Нашел папку soft_XXYYZZ
3. Скачал ver.rar из этой папки.

Как только появляется новая версия, старая удаляется те soft_XXYYZZ существует в единственном экземпляре.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Mark
Может быть, вот эти функции подойдут?

Код:
#include <FTPEx.au3>
_FTP_FindFileFirst
_FTP_FileGet
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Уху, я так и понял, что без этого дополнения не обойтись.
Сижу ковыряю, но пока сильно сказывается то, что опыт работы с AutoIt два дня :(
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Mark
Я сам не люблю UDF, но проблема в том, что имя файла заранее неизвестно...
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
В общем это все не то.
Данные функции перебирают файлы.
У меня же меняется имя папки :(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Если папка действительно всегда только одна, то это должно помочь
Код:
#include <Array.au3>
#include <FtpEx.au3>
$hOpen = _FTP_Open('myFTP')

$server = 'site.com'
$user = 'username'
$pass = 'pass'

$hConn = _FTP_Connect($hOpen, $server, $user, $pass)
_FTP_DirSetCurrent($hConn, 'update')
$a = _Ftp_ListToArray($hConn, 1)
_FTP_FileGet($hConn, '/update/' & $a[1] & '/ver.rar', @ScriptDir & '\ver.rar')
_FTP_Close($hOpen)
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Всем спасибо, помогли.
Использовал такую методику.

Код:
#include <FTPEx.au3>
#include <Array.au3>

$server = 'site.com'
$username = ''
$pass = ''
$s_Remote = 'update'

$Open = _FTP_Open('MyFTP Control')
$Conn = _FTP_Connect($Open, $server, $username, $pass) ; прицепились к ФТП

_FTP_DirSetCurrent($Conn, $s_Remote) ; перешли в update
$avArray = _FTP_ListToArray($Conn, 1) ; забили названия всех папок в массив
$aiResult = _ArraySearch($avArray, "soft_", 0, 0, 0, 1, 0, 0) ; поискали в массиве каталог с названием "soft_"

_FTP_FileGet($Conn, '/' & $s_Remote & '/' & $avArray[$aiResult] & '/ver.rar', 'ver.rar') ;слили нужный файл

_FTP_Close($Open) ; отцепились


Это все в теории. Скрипт смогу потестить только завтра на работе, отпишусь.
Всем спасибо.

PS Потестил на халявном хостинге воссоздав структуру рабочего ФТП. Все пучком, спасибо, скрипт чутка пришлось поправить, слеши забыл :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
snoitaleR [?]
Я сам не люблю UDF...

OffTopic:
И почему? Использование UDF - есть хорошая практика програмирования. Это сильно разгружает основную программу (алгоритм) и в разы облегчает понимание того, что ты там навоял, скажем, пару недель назад. А "все в одном" - это кошмар, особенно для тех, кто не писал это. Я рекомендую тебе наконец-то начать структурировать свои скрипты и испоьзовать Tidy, и через пару дней ты поймешь, что я был прав...

:smile:
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Как обычно хочется чего-то большего.
Докрутил проверку на двойной запуск скрипта, проверку пинга сервера - при отсутствии MsgBox и завершение скрипта.
Теперь хочу сделать логирование.
log.txt типа

"Присоединился.
Скачал.
Распаковал.
Установил."

Как реализовать догадываюсь, вот только ну никак в хелпе не найду как создать пустой файл :wacko:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Mark [?]
вот только ну никак в хелпе не найду как создать пустой файл
а зачем?
Код:
$hWrite = FileOpen($path, 2); покрути в хелпе последнюю цифру
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
2Kaster - спасибо, теперь вроде все. Очень выручил :beer:

На самом деле, скрип достаточно здоровый и делает много чего. Кроме конекта к ФТП серверу и пользоватся им буду не только я. Так, что защиту от дурака прикрутить нужно было :whistle:

Чутка из кода:
Код:
; запустим логирование
$log = FileOpen ("log.txt", 1)
FileWrite ($log, @CRLF & "  Запускаем скрипт обновления " & _NowCalc() & @CRLF)
; проверим наличие архиватора
If FileExists("Arj.exe") then
   Else
     Msgbox(0,"Проверка наличия архиватора","Архиватор Arj.exe отсутствует, обновление не возможно!")
     FileWrite ($log, "Архиватор Arj.exe отсутствует - скрипт завершает работу!" & @CRLF)
   Exit
EndIf
; проверим связь с сервером
$var = Ping($server,250)
If @error > 0 Then 
     Msgbox(0,"Проверка сервера обновлений","Связь отсутствует, обновление не возможно!")
     FileWrite ($log, "Связи нет - скрипт завершает работу!" & @CRLF)
    Exit
EndIf
FileWrite ($log, "Связь есть - продолжаем обновление." & @CRLF)


Думаю, теперь точно все :D :IL_AutoIt_1:
 
Верх