Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Методика удалённой сверки версий файлов... [D6, WinXP]


Makhanev A.S. ©   (2003-12-31 19:33:00) 

Локальная сеть.
На двух машинах (Клиент-Сервер) один и тот же файл.
На сервере обновился файл.
Клиент запрашивает у сервера данные об обновлениифайла на сервере, сравнивает с данными о своём файле и, если необходимо, обновляет.

Вопрос: что брать в качестве данных об обновлении?

CRC32? // а если только один байт поменялся(опечатку в слове исправили)...
LastModifiedDate? // а если дата на машине менялась...


Sir Alex   (2004-01-04 18:51:00) [1]

2 TButton
А ShellExecute, тут совсем не причем, он просто запускает update.exe c параметром /update

2 All
Так все же, как поступает народ при обновлении?


TButton   (2004-01-04 17:41:00) [2]

согласен, был неправ, просто с шеллом, который екзекьют, плохо знаком


Sir Alex   (2004-01-03 23:50:00) [3]

2 TButton
Можно. Вот маленький пример:
Сценарий:
1.Программа заходит на сайт (сервер), проверяет обновление, закачивает его в файл update.exe
2.Выполняет:

tmpstr:string;
tmpstr:="/update"+inttostr(GetCurrentProcessID);
ShellExecute(Application.Handle, "open", "update.exe", PChar(tmpstr), PChar(ProgPath), SW_SHOWDEFAULT);
Close;

3.А вот начало нашей программы:

if paramCount=1 then begin
tmpstr:=paramStr(1);
if pos("update",tmpstr)=2 then begin
delete (tmpstr,1,7);
mainProcessID:=strtoint64(tmpstr);
mainHandle:=OpenProcess (SYNCHRONIZE,false,mainProcessID);
tmpstr:=ExtractFilePath (Application.ExeName)+"/ufc.exe";
if (mainHandle<>0) then
if WaitForSingleObject (mainHandle,10000)<>WAIT_OBJECT_0 then
exit;
if sysUtils.DeleteFile (tmpstr) then
RenameFile (Application.ExeName,tmpstr);
end;
end;

Этот кусочек, ждет завершения основной программы и переименовывает update.exe в ufc.exe.
4.Вот и все. Программа сама себя обновила... Во всяком случае без помощи каких-либо загрузчиков или отдельных программ.

P.S. В общем все оказалось достаточно просто. Хотя может есть другие способы, более простые (хотя куда проще)?


TButton   (2004-01-03 21:05:00) [4]

в одном? никак. пиши загрузчик. или пиши прогу которая будет:
1. удалять prog.exe
2. переименовывать prog.tmp в prog.exe


Sir Alex   (2004-01-03 19:34:00) [5]

2 Rouse_ & raidan
Просто гении....

Как нить пользоваться Explorer"om, TotCmd, CommandLine я умею...

А, что такое смайлы? :)

Мой вопрос:
Как запущенная программа (exe) может поверх себя переписать другой?
Я например вижу только вариант: запускается загрузчик основной программы, проверяет ее обновление на сервере, если новая, то скачивает ее, переписывает поверх старой, запускает...
Так вот как это реализовать в одном exe"шнике?


raidan   (2004-01-03 19:00:00) [6]


> А как потом заменить старый файл на новый? Т.е. если я запустил
> exe"шник, нашел обновленный, скачал его допустим в prog.tmp,
> а что дальше?

Правой кнопкой мыши перетаскиваешь, потом "Переместить" и "Заменить"... (без смайлов)


Rouse_   (2004-01-03 15:55:00) [7]

> [4] Sir Alex © (03.01.04 14:58)
Ну Вы блин даете... (без смайлов)


Sir Alex   (2004-01-03 14:58:00) [8]

А как потом заменить старый файл на новый? Т.е. если я запустил exe"шник, нашел обновленный, скачал его допустим в prog.tmp, а что дальше?


Anatoly Podgoretsky   (2004-01-02 12:56:00) [9]

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


Rouse_   (2004-01-02 12:29:00) [10]

> CRC32? // а если только один байт поменялся(опечатку
> в слове исправили)...
> LastModifiedDate? // а если дата на машине менялась...

Собственная инкрементная метка в теле файла...


raidan   (2004-01-01 20:28:00) [11]

А что у тебя за файл: программа, БД, документ Word?

К тому же: "а если дата на машине менялась..." - вопрос не имеющий смысла!
Если качаешь файл с сервера, то будь добр - ставь на нем дату и время файла, которые стоят на этом файле на сервере!
Тогда, при обновлении, тебе нужно будет просто сравнить дату и время файла на сервере (дата и время не поменяются, если файл не будет изменен) и на клиенте. Если они разные, то качай новую версию...

ИМХО - это самое простое, если не хочешь возиться с написанием своего собственного PatchBuilder"а :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо