![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Методика удалённой сверки версий файлов... [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"а :)