Delphi реализует функцию автоматического обновления программного обеспечения.
Принцип прост: сохраните файл Update.ini на FTP, в котором записан номер версии обновляемого файла. Кроме того, файл Update.ini создается локально при каждом запуске программы обновления. сначала загружается с FTP с локальным именем Update_new.ini, а затем сравнивает два файла. Если номер новой версии больше, чем старый, или новый файл отсутствует в старом ini, они представляют собой файлы, которые нужно будет загрузить. обновлены, а затем загрузите их один за другим.
Имя этой программы — AutoUpdate. Вы создаете этот exe-файл, а затем упаковываете его вместе с основной программой. При создании ярлыка на рабочем столе вместо основной программы укажите AutoUpdate.
Локально также существует ini-файл, назовем его, например, ftp.ini. Содержимое внутри:
[конинформация]
основной = Project1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe: имя основной программы, которая находится в том же каталоге, что и программа обновления.
param={app}sayyes.pj2 -y bde.txt: это параметр командной строки, app — текущий путь, замените его в программе и передайте в основную программу (при необходимости)
Формат содержимого update.ini следующий:
[корень]
Офисный запрос.txt=20100519
[dbcard]
Sayyes.pj2=20100519
Пароль пользователя FTP.txt=20100519
[root] представляет корневой каталог, а [dbcard] представляет подкаталог и так далее.
модуль Main; интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, jpeg тип TfrmMain = класс (Тформа) IdFTP1: TIdHTTP; ProgressBar1: TProgressBar; ld_host: TLabeledEdit; ld_psw: TLabeledEdit; Label1: TLabel; ПрогрессБар2: TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; процедура IdFTP1Work (Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); процедура IdFTP1WorkEnd (Sender: TObject; AWorkMode: TWorkMode); процедура FormCreate (Sender: TObject) ; Private { Частные объявления } FSize:Integer; FPath: строка; FInitPath: строка; FHandle: HWND; FParam: строка; функция ConnectFTP: Boolean; *.dfm} //Загрузка процедуры выполнения TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); начало ProgressBar1.Position := AWorkCount; Application.ProcessMessages; end; AWorkMode: TWorkMode); начать ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end; процедура TfrmMain.FormCreate(Sender: TObject); Begin Self.Visible := False; //Флэш-экран, вы не можете добавить frm := TfrmFlash.Create( ноль); frm.Show; Application.ProcessMessages; FExePath: = ExtractFilePath(Application.ExeName); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //Загрузка ini-информации, например хоста и порта; попробуйте ConnectFTP; Self.Visible := True; DownLoadFile; наконец FreeAndNil(frm); IdFTP1.Quit := StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //После завершения обновления запустите основную программу и передайте параметры командной строки ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate; end; //Проверка процедуры обновления списка; TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; itemstr,itempath: string; item:TListItem; start oldFile:= TStringList.Create; newFile:= TStringList.Create; /Сначала загрузите файл update.ini на сервер и сохраните его в локальном файле update_new.ini. IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); если FileExists(FExePath + 'update.ini') = False, то выйти; oldFile.LoadFromFile(FExePath + 'update.ini'); .LoadFromFile(FExePath + 'update_new.ini'); путь к элементу: = ''; // Далее начинается сравнение двух списков. Если номер версии newFile больше, чем номер версии oldFile, или в oldFile нет номера версии, это означает, что его необходимо обновить для i := 0 до newFile. .Count - 1 do start itemstr := newFile.Strings[i ]; if itemstr = '' then Continue; if itemstr[1] = '[' then start itempath := Copy(itemstr,2,Length(itemstr)-2 ); //Если это корневой каталог if itempath = 'root' then itempath := '/'; Continue; itemstr := newFile.Names[i]; index := oldFile.IndexOfName(itemstr); if index = - 1 then start item := list_file.Items .Add; item.Caption := itemstr; item.SubItems.Add(itempath) end else start ver := StrToIntDef(newFile.Values[itemstr],0); если ver > StrToIntDef(oldFile.Values[itemstr],0), то начать item := list_file.Items.Add; item.Caption := itemstr; item.SubItems.Add( путь к элементу); конец; конец; если list_file.Items.Count = 0, то Application.Terminate; oldFile.Free; end; end; функция TfrmMain.ConnectFTP: Boolean; начать Результат: = False; попробуйте IdFTP1.Text; = StrToIntDef(ld_port.Text,21); .Имя пользователя := ld_имя_пользователя.Текст IdFTP1.Пароль :=; ld_psw.Text; IdFTP1.Passive := cb_mode.ItemIndex = 1; FInitPath := IdFTP1.RetrieveCurrentDir; Result := IdFTP1.Connected; кроме Result := False; end; //Загрузить процедуру обновления файла TfrmMain .DownLoadFile вар я: целое число; путь: строка; s1, s2: String; начало ProgressBar2.Max: = list_file.Items.Count; ProgressBar2.Position: = 0; FIniFile.EraseSection('error'); for i:= 0 to list_file.Items.Count - 1 начать Label4.Caption := 'Загрузка'+list_file.Items[i].Caption; Application.ProcessMessages; IdFTP1.ChangeDir(FInitPath); путь:= list_file.Items[i].SubItems.Strings[0]; если путь <>'/', то начать IdFTP1.ChangeDir(path); ForceDirectories(FExePath+path); list_file.Items[i].Caption; s2 := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); end else Begin s1 := list_file.Items[i].Caption;= FExePath+'/'+ list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); //Запись неудавшихся элементов FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); end; //Запись неудавшихся элементов FIniFile.WriteString('error',list_file.Items[i]. Caption,'Failed'); end; Label4.Caption := 'Все файлы обновлены! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False end; FIniFile.ReadString('coninfo','хост','******'); ld_username.Text := FIniFile.ReadString('coninfo','user','******' ld_psw.Text := FIniFile.ReadString('coninfo','psw','*****); *'); ld_port.Text := FIniFile.ReadString('coninfo','port','21'); cb_mode.ItemIndex := FIniFile.ReadInteger('coninfo','mode',1); FMainExe := FIniFile.ReadString('coninfo','main','Main.exe'); FParam := FIniFile.ReadString('coninfo','param); ',''); конец процедуры TfrmMain.SaveIni; FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','user',ld_username.Text); FIniFile.WriteString('coninfo','psw',ld_psw.Text); ; FIniFile.WriteString('coninfo','port',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex); конец;
Если у вас есть какие-либо вопросы, оставьте сообщение или зайдите в сообщество этого сайта, чтобы пообщаться и обсудить. Надеюсь, это поможет всем. Спасибо за вашу поддержку этого сайта!