程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi實現程序自動升級功能-升級精靈代碼

Delphi實現程序自動升級功能-升級精靈代碼

編輯:Delphi

用Delphi編寫的一個程序自動升級功能的代碼,就叫它“升級精靈”吧,本文會教大家做一個簡單的升級精靈程序,只要連接到互聯網,就能通過對比程序日期列出需要升級的文件列表,根據需要下載升級文件,讓程序的升級操作變得簡單。看看運行截圖:

Delphi升級精靈

編寫思路:在存放升級信息的服務器上放一個包含升級文件列表及信息的文件,利用TIdHTTP的GET過程下載這個信息文件,再分析裡面的內容,對比本地的信息文件列出需要升級的文件列表,最後根據信息列表的下載地址下載相關文件。完整代碼如下:

vIEw source print? 001 unit Unit1; 002 interface 003 uses 004   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 005   Dialogs, IDBaseComponent, IdComponent, IdTCPConnection, IdTCPClIEnt, 006   IdHTTP, StdCtrls, ComCtrls, CheckLst, IniFiles; 007 type 008   TForm1 = class(TForm) 009     IdHTTP1: TIdHTTP; 010     Button1: TButton; 011     Button2: TButton; 012     Button3: TButton; 013     ProgressBar1: TProgressBar; 014     ProgressBar2: TProgressBar; 015     Label1: TLabel; 016     Label2: TLabel; 017     Label3: TLabel; 018     StatusBar1: TStatusBar; 019     ListView1: TListVIEw; 020     procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; 021       const AWorkCount: Integer); 022     procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; 023       const AWorkCountMax: Integer); 024     procedure Button1Click(Sender: TObject); 025     procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); 026     procedure Button3Click(Sender: TObject); 027     procedure Button2Click(Sender: TObject); 028   private 029     function DownLoadFile(sURL, sFName: string): boolean; 030     { Private declarations } 031   public 032     { Public declarations } 033   end; 034 var 035   Form1: TForm1; 036 implementation 037 {$R *.dfm} 038 function AppPath: string; 039 begin 040   Result := ExtractFilePath(ParamStr(0)); 041 end; 042 function TForm1.DownLoadFile(sURL, sFName: string): boolean; 043 var //下載文件 044   tStream: TMemoryStream; 045 begin 046   tStream := TMemoryStream.Create; 047   try //防止不可預料錯誤發生 048     try 049       IdHTTP1.Get(sURL, tStream); //保存到內存流 050       tStream.SaveToFile(sFName); //保存為文件 051       Result := True; 052     finally //即使發生不可預料的錯誤也可以釋放資源 053       tStream.Free; 054     end; 055   except //真的發生錯誤執行的代碼 056     Result := False; 057     tStream.Free; 058   end; 059 end; 060 procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; 061   const AWorkCount: Integer); 062 begin 063   ProgressBar1.Position := AWorkCount; 064   Application.ProcessMessages; 065 end; 066 procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; 067   const AWorkCountMax: Integer); 068 begin 069   ProgressBar1.Max := AWorkCountMax; 070   ProgressBar1.Position := 0; 071 end; 072 procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); 073 begin 074   ProgressBar1.Position := 0; 075 end; 076 procedure TForm1.Button1Click(Sender: TObject); 077 const 078   sChkURL = 'http://www.xxx.com/update.ini'; 079 //  sChkURL = 'http://localhost/update.ini'; 080 var 081   NewFile, OrgFile: TIniFile; 082   SectionList: TStrings; 083   aFile: string; 084   aDate, bDate: TDate; 085   i: Integer; 086   ListItem: TListItem; 087 begin 088   StatusBar1.SimpleText := '檢測升級文件...'; 089   Button1.Enabled := False; 090   if not DownLoadFile(sChkURL, AppPath + 'tmp.ini'then 091   begin 092     StatusBar1.SimpleText := '檢測升級文件失敗!'; 093     Button1.Enabled := True; 094     Exit; 095   end; 096   StatusBar1.SimpleText := '分析升級文件...'; 097   ListVIEw1.Clear; 098   NewFile := TIniFile.Create(AppPath + 'tmp.ini'); 099   OrgFile := TIniFile.Create(AppPath + 'update.ini'); 100   try 101     SectionList := TStringList.Create; 102     try 103       //讀取升級文件列表 104       NewFile.ReadSections(SectionList); 105       for i := 0 to SectionList.Count - 1 do 106       begin 107         //讀取升級文件的文件名 108         aFile := NewFile.ReadString(SectionList.Strings[i], 'Name'''); 109         //讀取升級文件的日期 110         bDate := NewFile.ReadDate(SectionList.Strings[i], 'Date', Date); 111         //替換文件名的"."符號為"_",防止ini文件讀取錯誤,得到的文件名用來讀取本地升級信息 112         aFile := StringReplace(aFile, '.''_', [rfReplaceAll]); 113         //讀取本地升級文件的日期 114         aDate := OrgFile.ReadDate(aFile, 'Date'1999 1 1); 115         //如果以前沒有這個文件,那麼這個文件一定需要更新的,將日期缺省為1999-1-1,只要小於升級程序日期即可 116         if bDate > aDate then //對比日期確定是否需要升級 117         begin 118           ListItem := ListVIEw1.Items.Add; 119           ListItem.Checked := True; 120           //添加升級文件名 121           ListItem.Caption := NewFile.ReadString(SectionList.Strings[i], 'Name'''); 122           //添加升級文件大小 123           ListItem.SubItems.Add(NewFile.ReadString(SectionList.Strings[i], 'Size''')); 124           //添加升級文件日期 125           ListItem.SubItems.Add(NewFile.ReadString(SectionList.Strings[i], 'Date''')); 126           //添加升級文件下載地址 127           ListItem.SubItems.Add(NewFile.ReadString(SectionList.Strings[i], 'URL''')); 128           ListItem.SubItems.Add('未下載'); 129         end; 130       end; 131       if ListVIEw1.Items.Count = 0 then 132         MessageBox(handle, '沒有升級文件列表''信息', MB_OK) else 133         Button2.Enabled := True//有升級文件,下載按鈕可操作 134     finally 135       SectionList.Free; 136     end; 137   finally 138     OrgFile.Free; 139     NewFile.Free; 140   end; 141   StatusBar1.SimpleText := '就緒...'; 142   Button1.Enabled := True; 143 end; 144 procedure TForm1.Button3Click(Sender: TObject); 145 begin 146   Close; 147 end; 148 procedure TForm1.Button2Click(Sender: TObject); 149 var 150   i: integer; 151   aDownURL: string; 152   aFile: string; 153   aDate: TDate; 154 begin 155   StatusBar1.SimpleText := '正在下載升級文件...'; 156   Button1.Enabled := False; 157   Button2.Enabled := False; 158   ProgressBar2.Max := ListVIEw1.Items.Count; 159   for i := 0 to ListVIEw1.Items.Count - 1 do 160   begin 161     if ListVIEw1.Items.Item[i].Checked then //選擇了升級 162     begin 163       ListVIEw1.Items.Item[i].SubItems.Strings[3] := '下載中'; 164       //得到下載地址 165       aDownURL := ListVIEw1.Items.Item[i].SubItems.Strings[2]; 166       //得到文件名 167       aFile := ListVIEw1.Items.Item[i].Caption; 168       if DownLoadFile(aDownURL, aFile) then //開始下載 169       begin 170         ListVIEw1.Items.Item[i].SubItems.Strings[3] := '完成'; 171         aFile := StringReplace(aFile, '.''_', [rfReplaceAll]); 172         aDate := StrToDate(ListVIEw1.Items.Item[i].SubItems.Strings[1]); 173         with TIniFile.Create(AppPath + 'update.ini'do 174         begin //寫入已經升級日期 175           WriteDate(aFile, 'Date', aDate); 176         end; 177       end else 178         ListVIEw1.Items.Item[i].SubItems.Strings[3] := '失敗'; 179     end; 180     ProgressBar2.Position := ProgressBar2.Position + 1; 181     Application.ProcessMessages; 182   end; 183   MessageBox(handle, '下載升級文件完成''信息', MB_OK); 184   ProgressBar2.Position := 0; 185   StatusBar1.SimpleText := '就緒...'; 186   Button1.Enabled := True; 187   Button2.Enabled := True; 188 end; 189 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved