Delphi ตระหนักถึงฟังก์ชั่นการอัพเกรดซอฟต์แวร์อัตโนมัติ
หลักการนั้นง่ายมาก รักษาไฟล์ Update.ini บน FTP ซึ่งจะบันทึกหมายเลขเวอร์ชันของไฟล์ที่จะอัพเดต นอกจากนี้ยังมีไฟล์ Update.ini ในเครื่องอีกด้วย ดาวน์โหลดครั้งแรกจาก FTP เป็นชื่อในเครื่อง คือ Update_new.ini จากนั้นเปรียบเทียบทั้งสองไฟล์ หากหมายเลขเวอร์ชันใหม่มากกว่าหมายเลขเวอร์ชันเก่า หรือไฟล์ใหม่ไม่ได้อยู่ใน ini เก่า ไฟล์เหล่านี้จะแสดงถึงไฟล์ที่จะเป็น อัปเดตแล้วดาวน์โหลดทีละรายการ
ชื่อของโปรแกรมนี้คือ AutoUpdate คุณสร้าง exe นี้แล้วรวมเข้ากับโปรแกรมหลักเมื่อสร้างทางลัดบนเดสก์ท็อป ให้ชี้ไปที่ AutoUpdate แทนโปรแกรมหลัก
นอกจากนี้ยังมีไฟล์ ini ในเครื่องด้วย เช่น เรียกว่า ftp.ini เนื้อหาข้างในคือ
[ข้อมูล]
หลัก=Project1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe: คือชื่อของโปรแกรมหลัก ซึ่งอยู่ในไดเร็กทอรีเดียวกันกับโปรแกรมอัปเกรด
param={app}sayyes.pj2 -y bde.txt: นี่คือพารามิเตอร์บรรทัดคำสั่ง app คือเส้นทางปัจจุบัน แทนที่ในโปรแกรมและส่งผ่านไปยังโปรแกรมหลัก (หากจำเป็น)
รูปแบบเนื้อหาของ update.ini จะเป็นดังนี้
[ราก]
สอบถามข้อมูลสำนักงาน.txt=20100519
[ดีบีการ์ด]
sayyes.pj2=20100519
รหัสผ่านผู้ใช้ FTP.txt=20100519
[root] แสดงถึงไดเร็กทอรีราก และ [dbcard] แสดงถึงไดเร็กทอรีย่อย และอื่นๆ
หน่วยหลัก อินเทอร์เฟซใช้ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, jpeg; คลาส(TForm) IdFTP1: TIdHTTP; TIdHTTP; ld_port: TLabeledEdit; Label1: TLabeledEdit; TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; ขั้นตอน (ผู้ส่ง: TObject; AWorkMode: TWorkMode; const AWorkCount: จำนวนเต็ม) ; ส่วนตัว { ประกาศส่วนตัว } FSize: จำนวนเต็ม; FPath: string; FExePath: string; FIniFile: TIniFile; FHandle: สตริง; *.dfm} //ดาวน์โหลดขั้นตอนความคืบหน้า TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); AWorkMode: TWorkMode); เริ่ม ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end; ขั้นตอน TfrmMain.FormCreate(Sender: TObject); var frm: TfrmFlash; start Self.Visible := False; ไม่มี ); frm.Show; Application.ProcessMessages; FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //โหลดข้อมูล ini ซึ่งเป็นข้อมูล เช่น โฮสต์และพอร์ต LoadIni; CheckUpdateList; ในที่สุด FreeAndNil(frm); IdFTP1.Quit; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //หลังจากการอัปเดตเสร็จสิ้น ให้เริ่มโปรแกรมหลักและส่งผ่านพารามิเตอร์บรรทัดคำสั่ง ShellExecute(Handle,'open',PChar(FExePath+FMainEx) ,PChar(FParam),ไม่มี,SW_NORMAL); Application.Terminate; end; TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; item:TListItem; start oldFile := TStringList.Create; /ขั้นแรกให้ดาวน์โหลดไฟล์ update.ini บนเซิร์ฟเวอร์และบันทึกลงในไฟล์ update_new.ini ในเครื่อง IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); ถ้า FileExists(FExePath + 'update.ini') = False แล้วออก; oldFile.LoadFromFile(FExePath + 'update.ini'); .LoadFromFile(FExePath + 'update_new.ini'); itempath := ''; //ต่อไปนี้จะเริ่มต้นเพื่อเปรียบเทียบทั้งสองรายการ หากหมายเลขเวอร์ชันของ newFile มากกว่าหมายเลขเวอร์ชันของ oldFile หรือไม่มีหมายเลขเวอร์ชันใน oldFile แสดงว่าจำเป็นต้องอัปเดตสำหรับ i := 0 เป็น newFile .Count - 1 เริ่ม itemstr := newFile.Strings[i ]; ถ้า itemstr = '' ให้ดำเนินการต่อ; ถ้า itemstr[1] = '[' ให้เริ่ม itempath := Copy(itemstr,2,Length(itemstr)-2 ); //หากเป็นไดเรกทอรีรากถ้า itempath = 'root' จากนั้น itempath := '/'; Continue; end; itemstr := newFile.Names[i]; .Add; item.Caption := itemstr; item.SubItems.Add(itempath) สิ้นสุด else เริ่ม ver := StrToIntDef(newFile.Values[itemstr],0); ถ้า ver > StrToIntDef(oldFile.Values[itemstr],0) ให้เริ่มรายการ := list_file.Items.Add; item.Caption := itemstr; itempath); สิ้นสุด; สิ้นสุด; ถ้า list_file.Items.Count = 0 แล้ว Application.Terminate; oldFile.Free; newFile.Free; end; function TfrmMain.ConnectFTP: บูลีน; ลอง IdFTP1.Host := ld_host.Text; .ชื่อผู้ใช้ := ld_username.Text; ld_psw.Text; IdFTP1.Connected; ยกเว้นผลลัพธ์ := False; .DownLoadFile; var i:จำนวนเต็ม; เส้นทาง: string; s1,s2:String; start ProgressBar2.Max := list_file.Items.Count; 1 เริ่ม Label4.Caption := 'กำลังดาวน์โหลด'+list_file.Items[i].Caption; Application.ProcessMessages; IdFTP1.ChangeDir(FInitPath); path := list_file.Items[i].SubItems.Strings[0]; ถ้า path <>'/' ให้เริ่ม IdFTP1.ChangeDir(path); ForceDirectories(FExePath+path); list_file.Items[i].คำอธิบายภาพ s2 := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); end else เริ่ม s1 := list_file.Items[i].Caption; list_file.Items [i]. คำอธิบาย IdFTP1.Get (s1, s2, True); //บันทึกรายการที่ล้มเหลว FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); end; ยกเว้น //บันทึกรายการที่ล้มเหลว FIniFile.WriteString('error',list_file.Items[i] คำบรรยายภาพ 'ล้มเหลว'); end; Label4.Caption := 'อัปเดตไฟล์ทั้งหมด! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),สิ้นสุด; 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'); FIniFile.ReadString('coninfo','param ',''); สิ้นสุดขั้นตอน 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','พอร์ต',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex); สิ้นสุด;หากคุณมีคำถามใด ๆ โปรดฝากข้อความหรือไปที่ชุมชนของไซต์นี้เพื่อสื่อสารและหารือกัน ขอขอบคุณสำหรับการอ่าน ฉันหวังว่ามันจะช่วยทุกคนได้