PDA

Просмотр полной версии : Updater


mira
25.01.2012, 11:19
Вощем надоело мне давать обновления вручную, решил сделать как положено.

может кто подсказать с чего начать или какуюнеть статейку?
Интересует :
где хранить файлы, как регистрировать сайт и че там писать :) как получать доступ к нему из по и узнавать версию.
Как скачивать соответственно и получать список обновленных компонентов.

J-Fobos
25.01.2012, 14:22
Один из вариантов :) http://programmersforum.ru/showthread.php?t=34131

Silent
25.01.2012, 15:25
Один из вариантов :) http://programmersforum.ru/showthread.php?t=34131Кроме работы с архивом по данной ссылке ничего путевого нету.
Небольшие замечания по данному примеру:
- Качать каждый раз архив со всеми файлами глупо т.к. в программе может обновится только библиотека так зачем же тогда качать еще ехе и другие библиотеки если они есть. В данном случае нужно скачивать только те файлы которые обновились.
- Отдельный апдетор для программы это на любителя, я делал всегда апдейт программ в самой программе. Дико раздражает на руофе этот долбанный зависатор который сам толком не может обновится и клиент игры тоже обновляет как Бог на душу послал, поэтому имхо программа которая обновляет сама себя намного интереснее и исключает некоторые глюки.

mira
25.01.2012, 15:43
Кроме работы с архивом по данной ссылке ничего путевого нету.
Небольшие замечания по данному примеру:
- Качать каждый раз архив со всеми файлами глупо т.к. в программе может обновится только библиотека так зачем же тогда качать еще ехе и другие библиотеки если они есть. В данном случае нужно скачивать только те файлы которые обновились.
- Отдельный апдетор для программы это на любителя, я делал всегда апдейт программ в самой программе. Дико раздражает на руофе этот долбанный зависатор который сам толком не может обновится и клиент игры тоже обновляет как Бог на душу послал, поэтому имхо программа которая обновляет сама себя намного интереснее и исключает некоторые глюки.

идеальный алгоритм для меня это по принципу lameupdater.
Сверяем хеши наших файлов с хешами на сервере. Составляем список че обновить и качаем.

вот мне главное как запросить у серва список файлов с хешами и как скачать нужные:)
сжатие, хеширование и замену сделаю :)

Hint
25.01.2012, 17:15
Генерируешь текстовый файл, содержащий следующую информацию о каждом файле:
1. Имя файла
2. Контрольная сумма файла (лучше md5)
3. Размер файла в сжатом виде

Загружаешь этот служебный файл на сайт. Сжимаешь отдельно каждый файл программы и тоже загружаешь на сайт.

Контрольную сумму надо считать от оригинального файла. Размер указывать от архива с файлом.

Программа загружает с сайта служебный файл, проверяет все файлы по списку на отличие контрольной суммы, суммирует размер сжатых версий для получения общего размера загрузки (исключительно для информирования пользователя и для отображения общего прогресса загрузки), загружает необходимые файлы и распаковывает их.

mira
25.01.2012, 17:40
хм. найти какуюнеть надежную компонетнты бы умеющую загружать файло и дающую возможность отслеживать прогресс.

то есть примеры на стандартных инди но как я понял они имеют ряд подводных камней и затупов.

supernewbie
25.01.2012, 17:43
не компанента, но тоже норм - http://www.delphisources.ru/pages/faq/base/get_file_from_net_with_http.html

Hint
25.01.2012, 20:59
idHTTP вполне себе удобный компонент.

SeregaZ
25.01.2012, 21:35
и мои пять копеек. файл большой получится. ну всмысле 5 килобайт это конечно не много, но не лучше ли вести учет номера версии. поясняю:
вышел релиз программы, на сайте лежит файлик "ver", с цифоркой 1.
программа при запуске качает этот файл и сравнивает со своей версией то есть 1.
сделал какой-то новый файл, на сайте правишь тот файлик пишешь 2. и выкладываешь сам файл и тот файл с хешами.
программа получает первый мизерный файл, видит что цифорка изменилась - льет файл с хешами, сраванивает, выбирает что скачать, качает файлы.

в моем случае, тот файл с номером весил несколько байт. его проще каждый раз проверять.

mira
25.01.2012, 23:53
unit inntUtils;

interface

uses Wininet,Windows,sysutils,defineewa;

var
WININETHANDLE : Pointer=nil;

type
TInetLoadingCallback = function(progress : INT64):BOOL; stdcall;


function GetInetFile(const fileURL, FileName: string; ldc : TInetLoadingCallback): boolean;

implementation


function GetInetFile(const fileURL, FileName: string; ldc : TInetLoadingCallback): boolean;
const
BufferSize = 1024;
var
hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: file;
sAppName: string;
cmdl : array[0..511]of ansichar;
posit : INT64;
sz : INT64;
dwsz,dwreserved,ecode : DWORD;
begin
Result := False;
GetModuleFileName(0,@cmdl,sizeof(cmdl));
sAppName:=PAnsiChar(@cmdl);
sAppName := ExtractFileName(sAppName);
if WININETHANDLE=nil then WININETHANDLE:= InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if WININETHANDLE=nil then exit;
hURL := InternetOpenURL(WININETHANDLE, PChar(fileURL), nil, 0, 0, 0);
if hURL=nil then exit;
posit:=0;
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
inc(posit,BufferLen);
if assigned(ldc)then if not ldc(posit)then begin
CloseFile(f);
exit;
end;
until
BufferLen = 0;
CloseFile(f);
Result := True;
finally
InternetCloseHandle(hURL);
end;
end;

initialization

finalization
InternetCloseHandle(WININETHANDLE);

end.

чуток подправил, впринципе нормально

Yegor
26.01.2012, 00:22
Я тоже хочу сделать апдейтер. В принципе с загрузкой файлов проблем нет. Кто нибудь думал как бы автоматизировать загрузку новых файлов на сервер, как бы сделать одной кнопкой?

SeregaZ
26.01.2012, 02:26
через фтп наверное. еще добавь в реестр. чтоб правой кнопкой мышки на файле, а там выбор "отправить на сервер".

Добавлено через 5 минут
еще момент. бесплатные хосты частенько мрут или в дауне. поэтому лучше сделать проверку обновления с двух различных серверов. не с того, так со второго сольет обновку.

mira
26.01.2012, 02:29
Я тоже хочу сделать апдейтер. В принципе с загрузкой файлов проблем нет. Кто нибудь думал как бы автоматизировать загрузку новых файлов на сервер, как бы сделать одной кнопкой?

ага +1 нужно нужно

Morfik
26.01.2012, 03:59
я делаю так - храню на сервере сжатый файл зипом и файл с хешем этого файла (мд5) - на серваке лежит пхп скрипт который формирует ХМЛ с хешами файлов (тупо читаем сожержиое имя_файла.раширение.мд5

при запуске лаунчера загрузщка этого ХМЛ и сравнивание мд5 с текущими файлаими http://4gay.morfiksoft.net/filelist.php во пример.

При загрузке на сервер формирую мд5 файл и сам сжатый зипом файл.

Yegor
26.01.2012, 09:41
Morfik, а как загружаешь на сервер?

mira
26.01.2012, 11:31
Как я понял обязательно умение обращатса с пхп. Тут у меня проблемы.

Morfik
26.01.2012, 13:25
Yegor, по фтп, особо не заморачивался так что ручками

Добавлено через 39 минут
mira, ну тут ничего сложного вроде нету

<?php
echo '<?xml version="1.0" encoding="windows-1251"?>'.chr(0xD).chr(0xA);

function rec_listFiles( $from = '.', $begin_ch=0)
{
global $i;
$i=1;
if(! is_dir($from))
return false;

if( $dh = opendir($from))
{
while( false !== ($file = readdir($dh)))
{
// Skip '.' and '..'
if( $file == '.' || $file == '..')
continue;
$path = $from . '/' . $file;
if( is_dir($path) )
{
/*if ($i>1) echo "</cat>\n";
//echo $i."\n";
echo "<cat id=\"";
//c 6
if (substr($path,$begin_ch)=="none") echo "";
else echo substr($path,$begin_ch);
echo "\" >\n";
$i=1;*/
rec_listFiles($path);
}
else
{
if (substr($path,strlen($path)-3,3)==="md5")
{
echo "<file$i>";
echo substr($path,1,strlen($path)-5);
//echo substr($path,1,strlen($path)-1);
//echo substr($path,1,strlen($path)-5).chr(0xD).chr(0xA);
echo "</file$i>".chr(0xD).chr(0xA);

echo "<md5_$i>";
$handle = fopen(substr($path,2,strlen($path)-2), "r");
if ($handle)
{
$contents = fread($handle,32);
fclose($handle);
echo $contents;
}
echo "</md5_$i>".chr(0xD).chr(0xA);


$i++;
}

}
}
closedir($dh);
}
}
echo "<main>";
echo "<news>".chr(0xD).chr(0xA);
include "updater/news.txt";
echo "</news>".chr(0xD).chr(0xA);

$start_folder="./updater";
echo "<update>".chr(0xD).chr(0xA);
rec_listFiles($start_folder);
echo "</update>".chr(0xD).chr(0xA);
echo "</main>";
?>

на серваке лежат такие файлы
http://s008.radikal.ru/i304/1201/18/8980a12781b8.png

ответ получаем от скрипта в таком виде
<?xml version="1.0" encoding="windows-1251"?>
<main><news>
<autorun>1</autorun>
<showmessage>0</showmessage>
<title>Это не ошибка! Это предупреждение!</title>
<type>48</type>
<message>
Внимание !!!
Менеджер аккаунтов на реконструкции.
</message></news>
<update>
<file1>/updater/ssleay32.dll</file1>
<md5_1>ecdeb2fd0ed62e52205927680f98e2e3</md5_1>
<file2>/updater/4gay.dll</file2>
<md5_2>b25d053737448e2e9a87a0af708d0df7</md5_2>
<file3>/updater/4gay.exe</file3>
<md5_3>2a7c5d8a46e33b027ac6bc51c247f377</md5_3>
<file4>/updater/4gay.dat</file4>
<md5_4>80e339a15e2e8c8960149cfdeebfe66a</md5_4>
<file5>/updater/libeay32.dll</file5>
<md5_5>66cb9170a505a6e039877eec976c7931</md5_5>
<file6>/updater/updater.exe</file6>
<md5_6>2ab1ffcbc2441f73d698061e89643054</md5_6>
</update>
</main>

Sherman
27.01.2012, 17:42
Реализовать в Delphi работу с сайтом и файлами не проблема, видимо у дельфикодеров проблемы с php =) Не каждный асилит под какой то фреймворк сваять скрипт.