Delphi menyadari fungsi peningkatan perangkat lunak otomatis
Prinsipnya sederhana, Pertahankan file Update.ini di FTP, yang mencatat nomor versi file yang akan diperbarui. Ada juga file Update.ini secara lokal. Setiap kali program pembaruan dimulai, file Update.ini akan disimpan pertama diunduh dari FTP dengan nama lokal adalah Update_new.ini, lalu membandingkan kedua file tersebut jika nomor versi baru lebih besar dari yang lama, atau file baru tidak ada di ini yang lama, ini mewakili file yang akan didownload. diperbarui, lalu unduh satu per satu.
Nama program ini adalah AutoUpdate. Anda membuat exe ini dan kemudian mengemasnya dengan program utama. Saat membuat pintasan desktop, arahkan ke AutoUpdate dan bukan program utama.
Ada juga file ini secara lokal, sebut saja ftp.ini misalnya. Konten di dalamnya adalah
[info]
utama=Proyek1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe: adalah nama program utama, yang berada di direktori yang sama dengan program upgrade
param={app}sayyes.pj2 -y bde.txt: Ini adalah parameter baris perintah, aplikasi adalah jalur saat ini, ganti dalam program dan teruskan ke program utama (jika perlu)
Format konten update.ini adalah sebagai berikut
[akar]
Permintaan kantor.txt=20100519
[kartu db]
sayyes.pj2=20100519
Kata sandi pengguna FTP.txt=20100519
[root] mewakili direktori root, dan [dbcard] mewakili subdirektori, dan seterusnya.
unit Utama; antarmuka menggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, jpeg; kelas(Formulir T) IdFTP1: TIdFTP; IdHTTP1: TIdHTTP; ProgressBar1: TProgressBar; GroupBox1: TGroupBox; ld_host: TLabeledEdit; Label1: TLabeled; TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; prosedur IdFTP1Work(Pengirim: TObject; AWorkMode: TWorkMode; prosedur FormCreate(Pengirim: TObject) ; pribadi { Deklarasi pribadi } FUkuran:Bilangan Bulat; FPath: string; FExePath: string; FInitPath: string; FIniFile:TIniFile; FHandle:HWND; FMainExe:string; FParam: prosedur CheckUpdateList; *.dfm} //Unduh prosedur kemajuan TfrmMain.IdFTP1Work(Pengirim: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); mulai ProgressBar1.Position := AWorkCount; Application.ProcessMessages; AWorkMode: TWorkMode); mulai ProgressBar1.Position := 0; ProgressBar2.StepBy(1); prosedur TfrmMain.FormCreate(Pengirim: TObject); nil ); frm.Tampilkan; Aplikasi.ProsesPesan; FExePath := ExtractFilePath(Application.ExeName); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //Muat informasi ini, yaitu informasi seperti host dan port. LoadIni coba ConnectFTP; akhirnya FreeAndNil(frm); IdFTP1.Keluar; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //Setelah pembaruan selesai, mulai program utama dan teruskan parameter baris perintah ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Aplikasi.Terminate; //Periksa prosedur daftar pembaruan TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; itemstr,itempath: string; item:TListItem mulai oldFile := TStringList.Create; /Pertama unduh file update.ini di server dan simpan ke update_new.ini lokal IdFTP1.Get('update.ini',FexePath+'update_new.ini',True); if FileExists(FExePath + 'update.ini') = False lalu Keluar; .LoadFromFile(FexePath + 'update_new.ini'); jalur item := ''; //Berikut ini mulai membandingkan kedua daftar. Jika nomor versi File baru lebih besar dari nomor versi File lama atau tidak ada nomor versi di File lama, berarti perlu diperbarui untuk i := 0 ke File baru .Count - 1 mulai itemstr := newFile.Strings[i ]; jika itemstr = '' lalu Lanjutkan; jika itemstr[1] = '[' lalu mulai itempath := Copy(itemstr,2,Length(itemstr)-2 ); //Jika itu adalah direktori root jika itempath = 'root' lalu itempath := '/'; Lanjutkan akhir; itemstr := newFile.Names[i]; indeks := oldFile.IndexOfName(itemstr); .Tambahkan; item.Caption := itemstr; item.SubItems.Add(itempath) akhir lagi mulai ver := StrToIntDef(newFile.Values[itemstr],0); jika ver > StrToIntDef(oldFile.Values[itemstr],0) maka mulai item := list_file.Items.Add; item.Caption := itemstr; item.SubItems.Add( itempath); akhir; akhir; akhir; jika list_file.Items.Count = 0 maka Aplikasi.Terminate; oldFile.Free; newFile.Free; akhir; akhir; fungsi TfrmMain.ConnectFTP: Boolean; mulai Hasil := False; .Nama Pengguna := ld_nama pengguna.Teks; IdFTP1.Kata Sandi := ld_psw.Text; IdFTP1.Connect; IdFTP1.Passive := cb_mode.ItemIndex = 1; FInitPath := IdFTP1.RetrieveCurrentDir; .DownLoadFile; var i:Bilangan Bulat; jalur:string; s1,s2:String; mulai ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0; FIniFile.EraseSection('error'); 1 mulai Label4.Caption := 'Mengunduh'+list_file.Items[i].Caption; IdFTP1.ChangeDir(FInitPath); jalur := list_file.Items[i].SubItems.Strings[0]; jika jalur <>'/' maka mulai IdFTP1.ChangeDir(path); list_file.Item[i].Keterangan; s2 := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); akhiri yang lain mulai s1 := list_file.Items[i].Caption; list_file.Item[i].Keterangan; IdFTP1.Dapatkan(s1,s2,Benar); //Rekam item yang gagal FIniFile.WriteString('error',list_file.Items[i].Caption,'Success' akhir; //Rekam item yang gagal FIniFile.WriteString('error',list_file.Items[i]. Caption,'Gagal'); end; end; Label4.Caption := 'Semua file diperbarui! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PCar(FExePath+'update.ini'),False); FIniFile.ReadString('coninfo','host','******'); ld_namapengguna.Teks := FIniFile.ReadString('coninfo','pengguna','******'); ld_psw.Teks := FIniFile.ReadString('coninfo','psw','***** *'); ld_port.Teks := FIniFile.ReadString('coninfo','port','21'); FIniFile.ReadInteger('coninfo','mode',1); FMainExe := FIniFile.ReadString('coninfo','main','Main.exe');= FIniFile.ReadString('coninfo','param ',''); akhir; prosedur TfrmMain.SaveIni; FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','user',ld_username.Text); ; FIniFile.WriteString('coninfo','port',ld_port.Teks); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex akhir;
Jika Anda memiliki pertanyaan, silakan tinggalkan pesan atau kunjungi komunitas situs ini untuk berkomunikasi dan berdiskusi. Terima kasih telah membaca. Saya harap ini dapat membantu semua orang.