Delphi realisiert die Funktion des automatischen Software-Upgrades
Das Prinzip ist einfach. Pflegen Sie eine Update.ini-Datei auf FTP, die die Versionsnummer der zu aktualisierenden Datei aufzeichnet. Es gibt auch eine Update.ini-Datei lokal Zuerst wird von FTP der lokale Name Update_new.ini heruntergeladen und dann werden die beiden Dateien verglichen. Wenn die neue Versionsnummer größer als die alte ist oder die neue Datei nicht in der alten INI enthalten ist aktualisieren und sie dann einzeln herunterladen.
Der Name dieses Programms ist AutoUpdate. Sie generieren diese Exe und packen sie dann mit dem Hauptprogramm. Wenn Sie eine Desktop-Verknüpfung erstellen, zeigen Sie auf AutoUpdate statt auf das Hauptprogramm.
Es gibt auch lokal eine INI-Datei, nennen wir sie zum Beispiel ftp.ini. Der Inhalt darin ist
[coninfo]
main=Projekt1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe: ist der Name des Hauptprogramms, das sich im selben Verzeichnis wie das Upgrade-Programm befindet
param={app}sayyes.pj2 -y bde.txt: Dies ist der Befehlszeilenparameter, app ist der aktuelle Pfad, ersetzen Sie ihn im Programm und übergeben Sie ihn an das Hauptprogramm (falls erforderlich)
Das Inhaltsformat von update.ini ist wie folgt
[Wurzel]
Büroanfrage.txt=20100519
[dbcard]
sayyes.pj2=20100519
FTP-Benutzerpasswort.txt=20100519
[root] repräsentiert das Stammverzeichnis und [dbcard] repräsentiert das Unterverzeichnis und so weiter.
Unit Main; Schnittstelle verwendet Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, jpeg; Typ TfrmMain = Klasse(TForm) IdFTP1: TIdHTTP; ld_host: TLabeledEdit; ld_port: TLabeledEdit; TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; procedure IdFTP1Work(Sender: TWorkMode; const AWorkCount: Integer); procedure IdFTP1WorkEnd(Sender: TWorkMode); ; private { Private Deklarationen } FSize:Integer; FPath: string; FInitPath: string; FMainExe: string; function ConnectFTP: TfrmMain; *.dfm} //Download-Fortschrittsprozedur TfrmMain.IdFTP1Work(Sender: TObject; AWorkCount: Integer); begin ProgressBar1.Position := AWorkCount; end; procedure TfrmMain.IdFTP1WorkEnd AWorkMode: TWorkMode); begin ProgressBar1.Position := 0; ProgressBar2.StepBy(1); procedure TfrmMain.FormCreate(Sender: TfrmFlash; //Flash-Bildschirm, Sie können nicht hinzufügen: nil ); frm.Show; Application.ProcessMessages; FIniFile := TIniFile.Create(FExePath+'ftp.ini'); INI-Informationen wie Host und Port laden; CheckUpdateList; schließlich FreeAndNil(frm); IdFTP1.Quit; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //Nachdem das Update abgeschlossen ist, starten Sie das Hauptprogramm und übergeben Sie die Befehlszeilenparameter ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate; //Aktualisierungsliste beenden; TfrmMain.CheckUpdateList; var oldFile:TStringList; i,ver,index:Integer; begin oldFile := TStringList.Create; /Laden Sie zunächst die Datei update.ini auf den Server herunter und speichern Sie sie in der lokalen Datei update_new.ini IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); if FileExists(FExePath + 'update.ini') = False then Exit; oldFile.LoadFromFile(FExePath + 'newFile'); .LoadFromFile(FExePath + 'update_new.ini'); // Im Folgenden wird mit dem Vergleich der beiden Listen begonnen. Wenn die Versionsnummer von newFile größer als die Versionsnummer von oldFile ist oder keine Versionsnummer in oldFile vorhanden ist, bedeutet dies, dass sie für i := 0 auf newFile aktualisiert werden muss .Count - 1 do begin itemstr := newFile.Strings[i ]; if itemstr = '' then Continue; if itemstr[1] = '[' then begin itempath := Copy(itemstr,2,Length(itemstr)-2 ); //Wenn es das Stammverzeichnis ist, if itempath = 'root' then itempath := '/'; Continue; itemstr := oldFile.IndexOfName(itemstr); .Add; item.Caption := itemstr; item.SubItems.Add(itempath) end else begin ver := StrToIntDef(newFile.Values[itemstr],0); if ver > StrToIntDef(oldFile.Values[itemstr],0) then begin item := list_file.Items.Add; item.Caption := item.SubItems.Add( itempath); end; end; if list_file.Items.Count = 0 then Application.Terminate; oldFile.Free; end; function TfrmMain.ConnectFTP: Boolean; .Benutzername := ld_username.Text; IdFTP1.Password := ld_psw.Text; IdFTP1.Passive := cb_mode.ItemIndex; Result := IdFTP1.Connected; //Download-Dateiaktualisierungsvorgang .DownLoadFile; var i:Integer; path:string; s1,s2:String; begin ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0; FIniFile.EraseSection('error'); 1 do begin Label4.Caption := 'Downloading'+list_file.Items[i].Caption; Application.ProcessMessages; IdFTP1.ChangeDir(FInitPath); path := list_file.Items[i].SubItems.Strings[0]; if path <>'/' then begin IdFTP1.ChangeDir(path); s1 := 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; s2 := FExePath+'/'+ list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); //Fehlgeschlagene Elemente aufzeichnen FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); end; Caption,'Fehlgeschlagen'); end; Label4.Caption := 'Alle Dateien aktualisiert! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update.ini'),False); end; begin ld_host.Text FIniFile.ReadString('coninfo','host','******'); ld_username.Text := FIniFile.ReadString('coninfo','user','******'); ld_psw.Text := FIniFile.ReadString('coninfo','psw','***** *'); ld_port.Text := FIniFile.ReadString('coninfo','port','21'); FIniFile.ReadInteger('coninfo','mode',1); FMainExe := FIniFile.ReadString('coninfo','main','Main.exe'); FParam := FIniFile.ReadString('coninfo','param ',''); end; procedure 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 end);
Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder gehen Sie zur Community dieser Website, um zu kommunizieren und zu diskutieren. Ich hoffe, dass es allen helfen kann.