Delphi realiza a função de atualização automática de software
O princípio é simples. Manter um arquivo Update.ini no FTP, que registra o número da versão do arquivo a ser atualizado. Também existe um arquivo Update.ini localmente. primeiro baixado do FTP para o nome local é Update_new.ini e, em seguida, compara os dois arquivos. Se o novo número da versão for maior que o antigo ou o novo arquivo não estiver no ini antigo, eles representam os arquivos a serem. atualizado e baixe-os um por um.
O nome deste programa é AutoUpdate. Você gera este exe e o empacota com o programa principal. Ao criar um atalho na área de trabalho, aponte para AutoUpdate em vez do programa principal.
Também existe um arquivo ini localmente, vamos chamá-lo de ftp.ini, por exemplo.
[coninfo]
principal=Projeto1.exe
param={app}sayyes.pj2 -y bde.txt
main=Project1.exe: é o nome do programa principal, que está no mesmo diretório do programa de atualização
param={app}sayyes.pj2 -y bde.txt: Este é o parâmetro da linha de comando, app é o caminho atual, substitua-o no programa e passe-o para o programa principal (se necessário)
O formato do conteúdo de update.ini é o seguinte
[raiz]
Consulta do escritório.txt=20100519
[dbcard]
digasim.pj2=20100519
Senha do usuário FTP.txt=20100519
[root] representa o diretório raiz e [dbcard] representa o subdiretório e assim por diante.
interface principal da unidade usa Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls,IniFiles,ShellAPI, jpeg; classe (TForm) IdFTP1: IdHTTP1: TIdHTTP: TLabeledEdit; ld_host: TLabeledEdit; TProgressBar; Label3: TLabel; list_file: TListView; ; private { Declarações privadas } FSize:Integer; FPath: string; FExePath: string; string; FIniFile:Boolean end; *.dfm} //Procedimento de progresso do download TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer Begin ProgressBar1.Position := AWorkCount; Procedimento end; AWorkMode: TWorkMode); início ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end procedure TfrmMain.FormCreate(Sender: TObject); nil); FIniFile := TIniFile.Create(FExePath+'ftp.ini'); //Carrega informações ini, que são informações como host e porta. finalmente FreeAndNil(frm); StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //Após a conclusão da atualização, inicie o programa principal e passe os parâmetros da linha de comando ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate; TfrmMain.CheckUpdateList; var arquivo antigo, novo arquivo: TStringList; i, ver, índice: número inteiro; /Primeiro baixe o arquivo update.ini no servidor e salve-o no local update_new.ini IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); se FileExists(FExePath + 'update.ini') = False então Sair; .LoadFromFile(FExePath + 'update_new.ini'); //O seguinte começa a comparar as duas listas. Se o número da versão de newFile for maior que o número de versão de oldFile ou não houver número de versão em oldFile, significa que ele precisa ser atualizado para i := 0 para newFile. .Count - 1 inicia itemstr := newFile.Strings[i ]; if itemstr = '' then Continue; if itemstr[1] = '[' então inicia itempath := Copy(itemstr,2,Length(itemstr)-2 ); //Se for o diretório raiz if itempath = 'root' então itempath := '/' Continue se index = - 1 então comece item := list_file.Items; .Add; item.Caption := itemstr; item.SubItems.Add(itempath) end else start ver := StrToIntDef(newFile.Values[itemstr],0); if ver > StrToIntDef(oldFile.Values[itemstr],0) então comece item := list_file.Items.Add; item.Caption := itemstr; itempath); fim; fim fim; se list_file.Items.Count = 0 então Application.Terminate; oldFile.Free; newFile.Free; função final TfrmMain.ConnectFTP: Boolean; .Nome de usuário:=ld_nomedeusuário.Texto;IdFTP1.Senha:= ld_psw.Text; IdFTP1.Connect; IdFTP1.Passive := cb_mode.ItemIndex = 1; FInitPath := IdFTP1.RetrieveCurrentDir; .DownLoadFile; var i:Inteiro; caminho:string;s1,s2:String; começar ProgressBar2.Max := list_file.Items.Count; 1 comece Label4.Caption := 'Downloading'+list_file.Items[i].Caption; IdFTP1.ChangeDir(FInitPath); caminho list_file.Items[i].SubItems.Strings[0]; se caminho <>'/' então comece IdFTP1.ChangeDir(caminho); arquivo_lista.Items[i].Caption; FExecPath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); list_file.Items[i].Caption;IdFTP1.Get(s1,s2,True); //Registrar itens com falha FIniFile.WriteString('error',list_file.Items[i].Caption,'Success'); //Registrar itens com falha FIniFile.WriteString('error',list_file.Items[i]. Caption,'Falha'); end; Label4.Caption := 'Todos os arquivos atualizados! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False end; FIniFile.ReadString('coninfo','host','******'); ld_username.Text := FIniFile.ReadString('coninfo','user','******'); *'); ld_port.Text := FIniFile.ReadString('coninfo','porta','21'); FIniFile.ReadInteger('coninfo','mode',1); FMainExe := FIniFile.ReadString('coninfo','main','Main.exe'); ',''); fim do procedimento TfrmMain.SaveIni; FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','usuário',ld_username.Text); ;FIniFile.WriteString('coninfo','porta',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex);
Se você tiver alguma dúvida, deixe uma mensagem ou vá até a comunidade deste site para se comunicar e discutir. Obrigado pela leitura, espero que possa ajudar a todos.