Delphi 实现软件自动升级的功能
原理简单,在FTP上维护一个Update ini文件,里面记录着要更新文件的版本号,本地也有一个Update ini文件,
Delphi 实现软件自动升级的功能
原理简单,在FTP上维护一个Update.ini文件,里面记录着要更新文件的版本号,本地也有一个Update.ini文件,每次启动更新程序时,先从FTP上下载Update.ini文件到本地名字为Update_new.ini,然后比较这两个文件,如果新的版本号大于旧的,或者新的文件在就ini中没有,这些就表示要更新的文件,然后逐一下载。
本程序名字为AutoUpdate,你生成这个exe,然后和主程序一起打包,创建桌面快捷方式时,指向AutoUpdate,而不是主程序。
在本地还有一个ini文件,比如叫ftp.ini吧,里面内容是
[coninfo]
main=Project1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe:是主程序名称,和升级程序在同一目录
param={app}sayyes.pj2 -y bde.txt:这是命令行参数,app为当前路径,在程序中替换掉,传递给主程序(如果需要的话)
update.ini的内容格式如下
[root]
办事处查询.txt=20100519
[dbcard]
sayyes.pj2=20100519
FTP用户密码.txt=20100519
[root]代表根目录,后面的[dbcard]代表子目录,依次类推
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls,IniFiles,ShellAPI, jpeg; type TfrmMain = class(TForm) IdFTP1: TIdFTP; IdHTTP1: TIdHTTP; ProgressBar1: TProgressBar; GroupBox1: TGroupBox; ld_host: TLabeledEdit; ld_username: TLabeledEdit; ld_psw: TLabeledEdit; ld_port: TLabeledEdit; Label1: TLabel; cb_mode: TComboBox; ProgressBar2: TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); procedure FormCreate(Sender: TObject); private { Private declarations } FSize:Integer; FPath: string; FExePath: string; FInitPath: string; FIniFile:TIniFile; FHandle:HWND; FMainExe:string; FParam: string; procedure CheckUpdateList; function ConnectFTP:Boolean; procedure DownLoadFile; procedure LoadIni; procedure SaveIni; public { Public declarations } end; var frmMain: TfrmMain; implementation uses Flash; {$R *.dfm} //下载进度 procedure TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin ProgressBar1.Position := AWorkCount; Application.ProcessMessages; end; procedure TfrmMain.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end; procedure TfrmMain.FormCreate(Sender: TObject); var frm: TfrmFlash; begin Self.Visible := False; //闪屏,可以不加 frm := TfrmFlash.Create(nil); frm.Show; Application.ProcessMessages; FExePath := ExtractFilePath(Application.ExeName); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //加载ini信息,就是主机和端口之类的信息 LoadIni; try ConnectFTP; CheckUpdateList; Self.Visible := True; Application.ProcessMessages; DownLoadFile; finally FreeAndNil(frm); IdFTP1.Quit; FParam := StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //更新完毕后,启动主程序,并传入命令行参数 ShellExecute(Handle,'open',PChar(FExePath+FMainExe),PChar(FParam),nil,SW_NORMAL); Appli