//Загружает список файлов, а так же все необходимые файлы по этому списку
procedure TRobotForm.LoadFileFromWeb(System: string);
var
Result: string;
Source: string;
Index: integer;
i: integer;
Options: string;
UpFileOpen: boolean;
WRAR: byte;
begin
//Формируем список опций коммандной строки для WGET
//Пробелы в конце командной строки необходимы для правильной склейки
Options:='wget.exe ';
//Добавим в командную строку логин и пароль для доступа к хосту
if Data.HostAuthorization then
Options:=Options+'--http-user='+Data.HostUserLogin+' --http-passwd='+Data.HostUserPassw+' ';
//Стандартные параметры для загрузки списка файлов с сайта в корневую директорию робота
Options:=Options+'--no-directories --tries=20 --continue=on --cache=off --server-response=on --dot-style=mega ';
//--no-directories - в корень
//--tries=20 - кол-во попыток для загрузки
//--continue=on - Включить продолжение загрузки файла в случае обрыва соединения
//--cache=off - Запрет кэширования на уровне сервера. Дата закачанного файла будет родной
//--server-response=on - печатает на экране ответы сервера.
//--dot-style=mega - вид индикатора загрузки
//Если используется прокси сервер - добавляем в коммандную строку соответствующие параметры
if Data.Proxy then
begin
Options:=Options+'--proxy=on --execute http_proxy='+Data.ProxyIPAddress+':'+Data.ProxyPort+' ';
//Параметры авторизации прокси, если это необходимо
if Data.ProxyAuthorization then
Options:=Options+'--proxy-user='+Data.ProxyUserLogin+' --proxy-passwd='+Data.ProxyUserPassw+' ';
end;
//Формируем команду для загрузки списка файлов с сайта
CurrientCommand.Text:=Options+Data.HostSite+'/update.php?type='+System;
MemoScript.Text:=MemoScript.Text+'Загрузка списка файлов по команде:'+#13;
MemoScript.Text:=MemoScript.Text+CurrientCommand.Text+#10#13;
AppendLine(CurrientCommand.Text+#10#13);
//Делаем проверку на наличие файла
for i:=0 to 10 do //Всего 10 попыток по 2 секунды - этого достаточно для загрузки файла объемом 3 кб и сохранения на любом компьютере
begin
AssignFile(UpFile,'update.php@type='+System);
try
Reset(UpFile); //Открываем файл для обработки
UpFileOpen:=true;
except
UpFileOpen:=false;
Sleep(1000); //Ждем 1 секунду
end;
end;
//Если открыли файл, то начинаем с ним работать
if UpFileOpen then
while not EOF(UpFile) do
begin
readln(UpFile, Source);
Index:=Find(Source,'>'+System);
if Index<>0 then
begin
for i:=Index+1 to Length(Source) do
begin
if (Source='<')and(Source[i+1]='/')and(Source[i+2]='a')and(Source[i+3]='>') then Break;
//Здесь храниться только имя файла для загрузки
Result:=Result+Source;
end;
//Формируем команду для загрузки очередного файла
Options:='wget.exe ';
//Добавим в командную строку логин и пароль для доступа к хосту
if Data.HostAuthorization then
Options:=Options+'--http-user='+Data.HostUserLogin+' --http-passwd='+Data.HostUserPassw+' ';
//Добавляем параметр, указывающий в какую папку загружать скачанные файлы
Options:=Options+'--directory-prefix='+System+' ';
//Стандартные параметры для загрузки списка файлов с сайта в корневую директорию робота
Options:=Options+'--tries=20 --continue=on --cache=off --server-response=on --dot-style=mega ';
//Если используется прокси сервер - добавляем в коммандную строку соответствующие параметры
if Data.Proxy then
begin
Options:=Options+'--proxy=on --execute http_proxy='+Data.ProxyIPAddress+':'+Data.ProxyPort+' ';
//Параметры авторизации прокси, если это необходимо
if Data.ProxyAuthorization then
Options:=Options+'--proxy-user='+Data.ProxyUserLogin+' --proxy-passwd='+Data.ProxyUserPassw+' ';
//Отключаем модификацию файлов при загрузке через прокси.
if Data.ProxyNoClobber then
Options:=Options+'--no-clobber ';
end;
CurrientCommand.Text:=Options+Data.HostSite+'/updates/'+System+'/'+Result;
MemoScript.Text:=MemoScript.Text+'Загрузка файла '+Result+#10#13;
AppendLine(CurrientCommand.Text+#10#13);
//Посылаем команду на тестирование архива. Если Архив поврежден - производим повторную загрузку
AppendLine('wrar.exe t '+System+'\'+Result+#10#13);
Result:='';
end;
end;
end;
Проблемы с перенаправлением вывода из консоли
Возникла следующая проблема. Требуется запустить консольный менеджер закачек wget и выводить его работу на форму. Для перенаправления вывода из консоли использую пример hardcase conswrap скачанный с этого сайта. Работает отлично. Вот только так и не смог разобраться:
1. при передаче команды консоли - она ее исполняет. При передаче сразу 2 (3-х и т.д.) - они исполняются по очереди. Но вот если надо сделать так:
- передать 1-ю команду (закачка архива)
- передать 2-ю команду (тестирование архива)
- если архив скачан с ошибками - повторить загрузку
иначе команда на закачку следующего архива.
Так вот, при передаче первых двух команд (в одной процедуре) - архив качается и тестируется, но на это уходит слишком много времени, и если затем я пытаюсь найти в RichEdit упоминание об ошибке - его там еще нет. Получается такой механизм. Сначала передаются все сгенерированные команды, и лишь потом, когда процедура закончила работу, они выполняются в консоли.
Не получается у меня сделать так, что бы вторая команда посылалась на консоль только после того, как первая отработает.
Ниже привожу кусок этой процедуры. В качестве параметра ей передается строка, которая участвует в генерации путей и имени файла.
Код:
2. При использовании вышеупомянутого conswrap'а кроме моего приложения появляется и экран консоли. Пытался ему явно указать - запускаться скрытым или хотя бы свернутым - не помогает. Как не показывать консоль?
Пытался указать тут - кусочек модуля Utils:
Код:
function StartChildProcess(const Exe, Cmd: string;
****поскипано******************************
Sa.nLength:=sizeof(Sa);
Sa.lpSecurityDescriptor:=nil;
Sa.bInheritHandle:=true;
ZeroMemory(@Si,sizeof(Si));
Si.cb:=sizeof(Si);
Si.dwFlags:=STARTF_USESTDHANDLES;
Si.hStdInput:=StdInRead;
Si.hStdOutput:=StdOutWrite;
Si.hStdError:=StdOutWrite;
[COLOR="Red"]Si.wShowWindow:=SW_HIDE;[/COLOR]
****поскипано**********************************
****поскипано******************************
Sa.nLength:=sizeof(Sa);
Sa.lpSecurityDescriptor:=nil;
Sa.bInheritHandle:=true;
ZeroMemory(@Si,sizeof(Si));
Si.cb:=sizeof(Si);
Si.dwFlags:=STARTF_USESTDHANDLES;
Si.hStdInput:=StdInRead;
Si.hStdOutput:=StdOutWrite;
Si.hStdError:=StdOutWrite;
[COLOR="Red"]Si.wShowWindow:=SW_HIDE;[/COLOR]
****поскипано**********************************
Вот такая беда. Может кто сможет помочь?
P.S. Сорри за много буков:)