亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi 實現軟件自動升級的功能

2020-01-31 20:50:03
字體:
來源:轉載
供稿:網友

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);   Application.Terminate;  end; end;  //檢查更新列表 procedure TfrmMain.CheckUpdateList; var  oldFile,newFile:TStringList;  i,ver,index:Integer;  itemstr,itempath: string;  item:TListItem; begin  oldFile := TStringList.Create;  newFile := TStringList.Create;  try   list_file.Clear;   //先下載服務器上的update.ini文件,存到本地update_new.ini   IdFTP1.Get('update.ini',FExePath+'update_new.ini',True);   if FileExists(FExePath + 'update.ini') = False then Exit;   oldFile.LoadFromFile(FExePath + 'update.ini');   newFile.LoadFromFile(FExePath + 'update_new.ini');   itempath := '';   //下面開始比較兩個list,如果newFile的版本號大于oldFile的版本號或者oldFile中沒有的都表示要更新的   for i := 0 to newFile.Count - 1 do   begin    itemstr := newFile.Strings[i];    if itemstr = '' then Continue;    if itemstr[1] = '[' then    begin     itempath := Copy(itemstr,2,Length(itemstr)-2);     //如果是根目錄     if itempath = 'root' then      itempath := '/';     Continue;    end;    itemstr := newFile.Names[i];    index := oldFile.IndexOfName(itemstr);    if index = - 1 then    begin     item := list_file.Items.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 := itemstr;      item.SubItems.Add(itempath);     end;    end;   end;   if list_file.Items.Count = 0 then Application.Terminate;  finally   oldFile.Free;   newFile.Free;  end; end;  function TfrmMain.ConnectFTP: Boolean; begin  Result := False;  try  IdFTP1.Host := ld_host.Text;  IdFTP1.Port := StrToIntDef(ld_port.Text,21);  IdFTP1.Username := ld_username.Text;  IdFTP1.Password := ld_psw.Text;  IdFTP1.Connect;  IdFTP1.Passive := cb_mode.ItemIndex = 1;  FInitPath := IdFTP1.RetrieveCurrentDir;  Result := IdFTP1.Connected;  except   Result := False;  end; end;  //下載文件更新 procedure TfrmMain.DownLoadFile; var  i:Integer;  path:string;  s1,s2:String; begin  ProgressBar2.Max := list_file.Items.Count;  ProgressBar2.Position := 0;  FIniFile.EraseSection('error');  for i := 0 to list_file.Items.Count - 1 do  begin   Label4.Caption := '正在下載 '+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);    ForceDirectories(FExePath+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);    //記錄失敗項    FIniFile.WriteString('error',list_file.Items[i].Caption,'成功');   end;   except    //記錄失敗項    FIniFile.WriteString('error',list_file.Items[i].Caption,'失敗');   end;  end;  Label4.Caption := '所有文件更新完畢!';  DeleteFile(FExePath+'update.ini');  CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False); end;  procedure TfrmMain.LoadIni; 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');  cb_mode.ItemIndex := FIniFile.ReadInteger('coninfo','mode',1);  FMainExe := FIniFile.ReadString('coninfo','main','Main.exe');  FParam := FIniFile.ReadString('coninfo','param',''); end;  procedure TfrmMain.SaveIni; begin  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;  end. 

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文在线不卡| 久久手机精品视频| 成人国产精品色哟哟| 91亚洲国产成人久久精品网站| 国模视频一区二区| 国产99久久精品一区二区| 欧美性猛交xxxx| 亚洲一区美女视频在线观看免费| 亚洲黄在线观看| 精品国偷自产在线视频99| 欧美精品18videos性欧美| 国模视频一区二区三区| 97久久伊人激情网| 亚洲成人av片在线观看| 亚洲国产精彩中文乱码av在线播放| 91黑丝在线观看| 亚洲精品720p| 亚洲最新av在线网站| 日韩免费在线免费观看| 国产精品丝袜久久久久久不卡| 日韩在线国产精品| 亚洲精品suv精品一区二区| 日韩中文字幕视频在线| 国内精品小视频| 成人激情视频小说免费下载| 久久伊人免费视频| 欧美日韩人人澡狠狠躁视频| 亚洲精品中文字| 国产精品久久久久免费a∨大胸| 欧美一区在线直播| 精品成人在线视频| 亚洲人精选亚洲人成在线| 69视频在线免费观看| 久久久久久久久久久av| 国产精品久久久av| 欧美一级在线亚洲天堂| 在线亚洲午夜片av大片| 91高潮在线观看| 国产成+人+综合+亚洲欧美丁香花| 国产精品国产三级国产专播精品人| 欧美极品少妇xxxxⅹ裸体艺术| 欧美亚洲一级片| 国产精品白嫩初高中害羞小美女| 欧美国产高跟鞋裸体秀xxxhd| 日韩在线观看免费高清| 久久久久久久网站| 欧美在线免费视频| 国产精品高精视频免费| 在线亚洲男人天堂| 国产精品女人网站| 国产精品成人播放| 亚洲精品欧美极品| 九九久久久久久久久激情| 这里只有精品视频在线| 亚洲人成电影网站色…| 日韩免费在线电影| 日韩在线视频线视频免费网站| 国外成人免费在线播放| 在线免费观看羞羞视频一区二区| 国产日韩换脸av一区在线观看| 亚洲一区二区三区xxx视频| 久久久91精品国产| 日韩电影免费观看在线观看| 色与欲影视天天看综合网| 在线观看视频99| 久久亚洲一区二区三区四区五区高| 国产精品在线看| 精品久久久久久久久久国产| 中文字幕精品网| 日韩电视剧免费观看网站| 国产精品视频久久久久| 亚洲免费视频观看| 国产精品视频xxxx| 欧洲中文字幕国产精品| 免费av在线一区| 疯狂欧美牲乱大交777| 97国产精品人人爽人人做| 精品一区二区三区电影| 亚洲综合自拍一区| 久久国产精品网站| 成人国产精品色哟哟| 日韩电影视频免费| 日韩精品中文字幕在线观看| 一区二区三区久久精品| 国产精品久久久久久久av大片| 亚洲视频在线看| 97视频人免费观看| 精品国产户外野外| 日本中文字幕成人| 亚洲黄色免费三级| 国产精品美女无圣光视频| 精品毛片网大全| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久一区| 日韩小视频在线| 久久久欧美精品| 亚洲电影免费观看高清完整版| 91国偷自产一区二区三区的观看方式| 日韩欧美亚洲国产一区| 亚洲欧洲在线播放| 亚洲欧美日韩国产成人| 亚洲天堂男人天堂女人天堂| 日韩高清人体午夜| 亚洲人成电影网站色xx| 欧美在线激情视频| 久久久精品在线观看| 91av在线免费观看视频| 色综合天天狠天天透天天伊人| 亚洲欧洲在线观看| 久久精品国产久精国产思思| 最近2019中文字幕在线高清| 亚洲精品永久免费| 亚洲va欧美va国产综合剧情| 91精品国产自产91精品| 成人在线观看视频网站| 97超级碰碰碰久久久| 精品久久久久久中文字幕| 日韩精品999| 亚洲自拍偷拍在线| 日韩精品视频在线观看免费| 9.1国产丝袜在线观看| 国产999精品久久久影片官网| 国产美女被下药99| 久久福利视频网| 日韩精品福利网站| 国产精品久久一区| 欧美成人中文字幕| 主播福利视频一区| 法国裸体一区二区| 国产精品v片在线观看不卡| 日日骚久久av| 亚洲码在线观看| 精品国产91久久久久久老师| 国产成人高清激情视频在线观看| 日韩av电影中文字幕| 欧美成人在线免费| 91日韩在线视频| 国产精品成熟老女人| 欧美大人香蕉在线| 成人中心免费视频| 69视频在线免费观看| 91在线精品视频| 国产欧美一区二区三区视频| 中文字幕在线精品| 国产精品扒开腿爽爽爽视频| 国产日韩精品一区二区| 欧美猛交ⅹxxx乱大交视频| 国产成人一区二区在线| 日韩成人在线免费观看| 欧美黄色免费网站| 26uuu另类亚洲欧美日本老年| 国产精品久久久久久一区二区| 综合国产在线视频| 国内精品久久影院| 日韩视频在线免费观看| 久久国产精品首页| 色综合久久天天综线观看| 一区二区福利视频| 亚洲精品网址在线观看| 日本一区二三区好的精华液| 久久久久久免费精品| 色哟哟网站入口亚洲精品| 91av国产在线| 久久久亚洲欧洲日产国码aⅴ|