Delphi はソフトウェアの自動アップグレード機能を実現します
原理は簡単です。更新するファイルのバージョン番号を記録する Update.ini ファイルを FTP 上で管理します。また、Update.ini ファイルは、更新プログラムが起動されるたびに保存されます。最初に FTP からローカル名 Update_new.ini にダウンロードされ、新しいバージョン番号が古いバージョン番号より大きい場合、または新しいファイルが古い ini にない場合、これらのファイルが比較されます。更新してから、1 つずつダウンロードします。
このプログラムの名前は AutoUpdate です。この exe を生成し、メイン プログラムと一緒にパッケージ化します。デスクトップ ショートカットを作成するときは、メイン プログラムではなく AutoUpdate をポイントします。
ローカルには ini ファイルもあります。たとえば、ftp.ini と呼びます。その内容は次のとおりです。
[情報]
main=プロジェクト1.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] はサブディレクトリを表します。
ユニット Main; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、ダイアログ、StdCtrls、IdHTTP、IdBaseComponent、IdComponent、IdTCPConnection、IdTCPClient、IdFTP、ComCtrls、ExtCtrls、IniFiles、ShellAPI、jpeg を使用します。クラス(TForm) IdFTP1: IdHTTP1: TProgressBar; ld_host: TLabeledEdit; ラベル 1: TLabeledEdit; TProgressBar; ラベル 3: TLabel; リスト ファイル: TListView; プロシージャ IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode); プロシージャ FormCreate(Sender: TObject) ; private { プライベート宣言 } FSize:Integer; FPath: 文字列; FInitPath: 文字列; FMainExe: 文字列; 関数 FrmMain: TfrmMain; *.dfm} //ダウンロードの進行状況 TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin ProgressBar1.Position := AWorkCount; end; AWorkMode: TWorkMode); begin ProgressBar1.Position := 0; ProgressBar2.StepBy(1); 手続き TfrmMain.FormCreate(Sender: TfrmFlash); // フラッシュ画面を追加できません := TfrmFlash nil ); frm.Show; FExePath := ExtractFilePath(Application.ExeName); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); // ホストやポートなどの ini 情報をロードします。最後に FreeAndNil(frm); StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //更新が完了したら、メイン プログラムを起動し、コマンド ライン パラメータを渡します ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar(FParam),nil,SW_NORMAL); // 更新リストの確認 end; TfrmMain.CheckUpdateList; i,ver,index:Integer; itemstr,itempath; 開始 oldFile := TStringList.Create; /まず、update.ini ファイルをサーバーにダウンロードし、ローカルの update_new.ini に保存します。 IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); FileExists(FExePath + 'update.ini') = False の場合、終了します。 .LoadFromFile(FExePath + 'update_new.ini'); // 以下は 2 つのリストの比較を開始します。 newFile のバージョン番号が oldFile のバージョン番号より大きい場合、または oldFile にバージョン番号がない場合は、i := 0 を 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 ); // ルートディレクトリの場合itempath = 'root' then itempath := '/'; 続行; itemstr := newFile.IndexOfName(itemstr); インデックス = - 1 の場合、 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 := item.SubItems.Add( itempath); 終了; list_file.Items.Count = 0 の場合、最後に終了します。 oldFile.Free; newFile.Free 終了; 関数 TfrmMain.ConnectFTP: 結果 := IdFTP1.Text := IdFTP1; .ユーザー名 := ld_username.Text; ld_psw.Text; IdFTP1.Passive := cb_mode.ItemIndex = 1; FInitPath := IdFTP1.Connected; // ファイル更新プロシージャをダウンロードします。 .DownLoadFile; var i:Integer;パス:文字列; s1,s2:String; 開始 ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0 から list_file.Items.Count - 1 do begin Label4.Caption := 'Downloading'+list_file.Items[i].Caption; IdFTP1.ChangeDir(FInitPath); パス := list_file.Items[i].SubItems.Strings[0]; パス <>'/' の場合、ForceDirectories(FExePath+path); list_file.Items[i].Caption := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); end else begin s1 := list_file.Items[i].Caption; list_file.Items[i].Caption; //失敗した項目を記録する FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); //失敗した項目を記録する FIniFile.WriteString('error',list_file.Items[i]. Caption,'失敗') end; Label4.Caption := 'すべてのファイルが更新されました。 '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),False) プロシージャ 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','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','port',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex);
ご質問がございましたら、メッセージを残すか、このサイトのコミュニティにアクセスしてご連絡ください。お読みいただきありがとうございます。このサイトをご支援いただきありがとうございます。