Delphi réalise la fonction de mise à niveau automatique du logiciel
Le principe est simple : Conservez un fichier Update.ini sur FTP, qui enregistre le numéro de version du fichier à mettre à jour. Il existe également un fichier Update.ini en local. Chaque fois que le programme de mise à jour est lancé, le fichier Update.ini est. téléchargé d'abord depuis FTP sous le nom local est Update_new.ini, puis compare les deux fichiers. Si le nouveau numéro de version est supérieur à l'ancien, ou si le nouveau fichier ne se trouve pas dans l'ancien ini, ceux-ci représentent les fichiers à utiliser. mis à jour, puis téléchargez-les un par un.
Le nom de ce programme est AutoUpdate. Vous générez cet exe, puis le conditionnez avec le programme principal. Lors de la création d'un raccourci sur le bureau, pointez sur AutoUpdate au lieu du programme principal.
Il existe également un fichier ini localement, appelons-le ftp.ini par exemple. Le contenu à l'intérieur est.
[infos]
principal = Projet1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe : est le nom du programme principal, qui se trouve dans le même répertoire que le programme de mise à niveau
param={app}sayyes.pj2 -y bde.txt : Ceci est le paramètre de ligne de commande, app est le chemin actuel, remplacez-le dans le programme et transmettez-le au programme principal (si nécessaire)
Le format du contenu de update.ini est le suivant
[racine]
Demande de bureau.txt=20100519
[carte de base de données]
dis oui.pj2=20100519
Mot de passe de l'utilisateur FTP.txt=20100519
[root] représente le répertoire racine, le [dbcard] suivant représente le sous-répertoire, et ainsi de suite.
unité principale ; l'interface utilise Windows, Messages, SysUtils, Variantes, Classes, Graphiques, Contrôles, Formulaires, Boîtes de dialogue, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, tapez TfrmMain = classe (TForm) IdFTP1 : TIdHTTP1 : TIdHTTP ; TProgressBar ; Label3 : TLabel ; list_file : TListView ; procédure IdFTP1Work (Expéditeur : TObject ; AWorkMode : TWorkMode ; const AWorkCount : Integer); procédure IdFTP1WorkEnd (Expéditeur : TObject ; AWorkMode : TWorkMode ); ; private { Déclarations privées } FSize:Integer; FPath : chaîne ; FExePath : chaîne ; FIniFile : TIniFile ; var frmMain : l'implémentation de TfrmMain ; *.dfm} //Procédure de progression du téléchargement TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); AWorkMode : TWorkMode); commencer ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end; procédure TfrmMain.FormCreate(Sender: TObject); var frm: TfrmFlash; start Self.Visible := //Écran Flash, vous ne pouvez pas ajouter frm := TfrmFlash.Create( néant ); frm.Show; Application.ProcessMessages; FExePath := ExtractFilePath(Application.ExeName); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //Charger les informations ini, qui sont des informations telles que l'hôte et le port ; essayez ConnectFTP ; Self.Visible := True Application.ProcessMessages ; enfin FreeAndNil(frm); IdFTP1.Quit ; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //Une fois la mise à jour terminée, démarrez le programme principal et transmettez les paramètres de ligne de commande ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate fin //Vérification de la procédure de mise à jour de la liste ; TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; itemstr,itempath: string item:TListItem; /Téléchargez d'abord le fichier update.ini sur le serveur et enregistrez-le dans le fichier update_new.ini local. IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); si FileExists(FExePath + 'update.ini') = False alors quittez; .LoadFromFile(FExePath + 'update_new.ini'); itempath := ''; // Commencez à comparer les deux listes ci-dessous. Si le numéro de version de newFile est supérieur au numéro de version de oldFile ou s'il n'y a pas de numéro de version dans oldFile, cela signifie qu'il doit être mis à jour pour i := 0 vers newFile.Count. - 1 commence itemstr := newFile.Strings[i ]; if itemstr = '' then Continue; if itemstr[1] = '[' then start itempath := Copy(itemstr,2,Length(itemstr)-2); //Si c'est le répertoire racine si itempath = 'root' then itempath := '/'; Continuer; itemstr := newFile.Names[i]; index := oldFile.IndexOfName(itemstr); .Add; item.Caption := itemstr; item.SubItems.Add(itempath) end else start ver := StrToIntDef(newFile.Values[itemstr],0); si ver > StrToIntDef(oldFile.Values[itemstr],0) alors commencez l'élément := list_file.Items.Add; item.Caption := itemstr; itempath); end; end; si list_file.Items.Count = 0 alors Application.Terminate; oldFile.Free; newFile.Free; fin; fonction TfrmMain.ConnectFTP: Boolean; start Résultat := False; .Nom d'utilisateur := ld_nom d'utilisateur.Text; IdFTP1.Mot de passe := ld_psw.Text; IdFTP1.Passive := cb_mode.ItemIndex = 1; FInitPath := IdFTP1.RetrieveCurrentDir; Résultat := IdFTP1.Connected; .DownLoadFile ; var i : Entier ; chemin:string; s1,s2:String; commencer ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0; 1 commencez Label4.Caption := 'Downloading'+list_file.Items[i].Caption Application.ProcessMessages; IdFTP1.ChangeDir(FInitPath); path := list_file.Items[i].SubItems.Strings[0]; si chemin <>'/' alors commencez IdFTP1.ChangeDir(path); list_file.Items[i].Caption; s2 := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); end else start s1 := list_file.Items[i].Caption; list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); //Enregistrement des éléments ayant échoué FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); end; //Enregistrement des éléments ayant échoué FIniFile.WriteString('error',list_file.Items[i]. Caption,'Échec'); end; Label4.Caption := 'Tous les fichiers ont été mis à jour ! '; Supprimer le fichier (FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False end; procédure TfrmMain.LoadIni; 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','FParam := FIniFile.ReadString('coninfo','param); ',''); fin; procédure TfrmMain.SaveIni; FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','user',ld_username.Text); ; FIniFile.WriteString('coninfo','port',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex end);
Si vous avez des questions, n'hésitez pas à laisser un message ou à vous rendre dans la communauté de ce site pour communiquer et discuter. Merci d'avoir lu, j'espère que cela pourra aider tout le monde. Merci pour votre soutien à ce site !