Просмотр полной версии : Updater
Вощем надоело мне давать обновления вручную, решил сделать как положено.
может кто подсказать с чего начать или какуюнеть статейку?
Интересует :
где хранить файлы, как регистрировать сайт и че там писать :) как получать доступ к нему из по и узнавать версию.
Как скачивать соответственно и получать список обновленных компонентов.
Один из вариантов :) http://programmersforum.ru/showthread.php?t=34131
Один из вариантов :) http://programmersforum.ru/showthread.php?t=34131Кроме работы с архивом по данной ссылке ничего путевого нету.
Небольшие замечания по данному примеру:
- Качать каждый раз архив со всеми файлами глупо т.к. в программе может обновится только библиотека так зачем же тогда качать еще ехе и другие библиотеки если они есть. В данном случае нужно скачивать только те файлы которые обновились.
- Отдельный апдетор для программы это на любителя, я делал всегда апдейт программ в самой программе. Дико раздражает на руофе этот долбанный зависатор который сам толком не может обновится и клиент игры тоже обновляет как Бог на душу послал, поэтому имхо программа которая обновляет сама себя намного интереснее и исключает некоторые глюки.
Кроме работы с архивом по данной ссылке ничего путевого нету.
Небольшие замечания по данному примеру:
- Качать каждый раз архив со всеми файлами глупо т.к. в программе может обновится только библиотека так зачем же тогда качать еще ехе и другие библиотеки если они есть. В данном случае нужно скачивать только те файлы которые обновились.
- Отдельный апдетор для программы это на любителя, я делал всегда апдейт программ в самой программе. Дико раздражает на руофе этот долбанный зависатор который сам толком не может обновится и клиент игры тоже обновляет как Бог на душу послал, поэтому имхо программа которая обновляет сама себя намного интереснее и исключает некоторые глюки.
идеальный алгоритм для меня это по принципу lameupdater.
Сверяем хеши наших файлов с хешами на сервере. Составляем список че обновить и качаем.
вот мне главное как запросить у серва список файлов с хешами и как скачать нужные:)
сжатие, хеширование и замену сделаю :)
Генерируешь текстовый файл, содержащий следующую информацию о каждом файле:
1. Имя файла
2. Контрольная сумма файла (лучше md5)
3. Размер файла в сжатом виде
Загружаешь этот служебный файл на сайт. Сжимаешь отдельно каждый файл программы и тоже загружаешь на сайт.
Контрольную сумму надо считать от оригинального файла. Размер указывать от архива с файлом.
Программа загружает с сайта служебный файл, проверяет все файлы по списку на отличие контрольной суммы, суммирует размер сжатых версий для получения общего размера загрузки (исключительно для информирования пользователя и для отображения общего прогресса загрузки), загружает необходимые файлы и распаковывает их.
хм. найти какуюнеть надежную компонетнты бы умеющую загружать файло и дающую возможность отслеживать прогресс.
то есть примеры на стандартных инди но как я понял они имеют ряд подводных камней и затупов.
supernewbie
25.01.2012, 17:43
не компанента, но тоже норм - http://www.delphisources.ru/pages/faq/base/get_file_from_net_with_http.html
idHTTP вполне себе удобный компонент.
и мои пять копеек. файл большой получится. ну всмысле 5 килобайт это конечно не много, но не лучше ли вести учет номера версии. поясняю:
вышел релиз программы, на сайте лежит файлик "ver", с цифоркой 1.
программа при запуске качает этот файл и сравнивает со своей версией то есть 1.
сделал какой-то новый файл, на сайте правишь тот файлик пишешь 2. и выкладываешь сам файл и тот файл с хешами.
программа получает первый мизерный файл, видит что цифорка изменилась - льет файл с хешами, сраванивает, выбирает что скачать, качает файлы. 
в моем случае, тот файл с номером весил несколько байт. его проще каждый раз проверять.
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.
чуток подправил, впринципе нормально
Я тоже хочу сделать апдейтер. В принципе с загрузкой файлов проблем нет. Кто нибудь думал как бы автоматизировать загрузку новых файлов на сервер, как бы сделать одной кнопкой?
через фтп наверное. еще добавь в реестр. чтоб правой кнопкой мышки на файле, а там выбор "отправить на сервер".
Добавлено через 5 минут
еще момент. бесплатные хосты частенько мрут или в дауне. поэтому лучше сделать проверку обновления с двух различных серверов. не с того, так со второго сольет обновку.
Я тоже хочу сделать апдейтер. В принципе с загрузкой файлов проблем нет. Кто нибудь думал как бы автоматизировать загрузку новых файлов на сервер, как бы сделать одной кнопкой?
ага +1 нужно нужно
я делаю так - храню на сервере сжатый файл зипом и файл с хешем этого файла (мд5) - на серваке лежит пхп скрипт который формирует ХМЛ с хешами файлов (тупо читаем сожержиое имя_файла.раширение.мд5
при запуске лаунчера загрузщка этого ХМЛ и сравнивание мд5 с текущими файлаими http://4gay.morfiksoft.net/filelist.php во пример.
При загрузке на сервер формирую мд5 файл и сам сжатый зипом файл.
Morfik, а как загружаешь на сервер?
Как я понял обязательно умение обращатса с пхп. Тут у меня проблемы.
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>
Реализовать в Delphi работу с сайтом и файлами не проблема, видимо у дельфикодеров проблемы с php =) Не каждный асилит под какой то фреймворк сваять скрипт.
vBulletin® v3.6.11, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot