Проверка обновления программы. Delphi

Здравствуйте, уважаемые читатели блога! Каждый нормальный разработчик, который постоянно обновляет функциональный состав своей программы, устраняет баги, задумывался о том, что ему придется реализовать функцию проверки обновления программы и возможно даже с последующим скачиванием на компьютер пользователя. Поэтому хочу сегодня описать один из способов проверки обновления программы с последующим закачиванием на компьютер на языке Delphi.

Суть алгоритма проверки обновления программы проста:

  1. Программа удаленно проверяет на сервере версию программы, которая записана в некий файл (например,version.txt);
  2. Если номер записанный в файле на сервере больше номера версии (или не равен) записанной в коде программы, то уведомляем пользователя, о том, что на сервере находится обновленная программа, можно вывести и версию программы и предложить пользователю скачать программу.
  3. Если пользователь нажал на кнопку «Скачать обновление», то качаем с сервера программу.

Я не являюсь автором данного алгоритма, нашел давно на просторах Интернета, к большому сожалению автор мне не известен.

Прежде чем приступит к  программной реализации алгоритма обновления программы, скачаем библиотеку Synapse. Данная библиотека позволит с легкостью отправить запрос на удаленный сервер и получить ответ от него.

Подключение необходимый библиотек

uses
    ... Wininet, HTTPsend;

Определяем переменные, которые будем использовать в ходе программы

var
  version: String;   // версия программы
  URL, FN: string;   // URL - путь к файлу программы,  FN - имя программы
  HTMLtext:String;   // полученный ответ от сервера

Используем функцию для скачивания файла

function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
   Result:=False;
   sAppName := ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
         nil, nil, 0);
   try
      hURL := InternetOpenURL(hSession,
      PChar(fileURL),nil,0,0,0);
      try
         AssignFile(f, FileName);
         Rewrite(f,1);
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen)
         until BufferLen = 0;
         CloseFile(f);
         Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
   finally
   InternetCloseHandle(hSession)
   end
end;

Далее на форме нашей программы, для примера, ставим объект Memo и Button. В поле Memo будет выводится информация о версии программы и закачки. Запрос версии программы происходит с помощью метода GET по протоколу HTTP.

procedure TForm1.FormCreate(Sender: TObject);
var
HTTP: THTTPsend;
HTML: TStringlist;
begin
version:='1.0';                   //  версия данной программы
HTML:= TStringlist.Create;
HTTP:= THTTPSend.Create;
HTTP.HTTPMethod('GET', 'http://entropiya-blog.ru/version_test.txt'); // файл в котором записана версия программы (например, 1.1)
HTML.LoadFromStream(HTTP.Document);
HTMLtext:=HTML.Text;
if pos(HTML.Text,version)<>0 then
begin
Memo1.Lines.Add('Обновления не обнаружены');
end else
begin
Memo1.Lines.Add('Доступна новая версия для скачивания test.zip '+HTML.Text);
Memo1.Lines.Add('Нажмите кнопку "Скачать "');
Button1.Enabled:=True;
end;
end;

Далее реализуем скачивание программы при нажатии на кнопку «Скачать обновление». За закачу файла и его сохранение отвечает функция GetInetFile, которая была описана выше.

procedure TForm1.Button1Click(Sender: TObject);
begin
if pos(version, HTMLtext)<>0 then
begin
Memo1.Lines.Add('Обновления не обнаружены');
end else
begin
Memo1.Lines.Add('Началась скачка файла');
URL:='http://entropiya-blog.ru/test.zip';  // путь к вашему файлу, который необходимо скачать с сервера
FN:='test.zip';                            // имя файла, который необходимо скачать с сервера
if GetInetFile(URL, FN) then
begin
Memo1.Lines.Add('Файл успешно скачан в папку с программой');
end else
begin
Memo1.Lines.Add('Ошибка');
end;
end;
end;

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

P.S. На сервер закачайте текстовый файл например с именем, version.txt и в него впишите версию вашей программы (к примеру, 1.1).