Delphi implementa la función de actualización automática de software
El principio es simple: mantenga un archivo Update.ini en FTP, que registre el número de versión del archivo que se actualizará. También hay un archivo Update.ini localmente. Cada vez que se inicia el programa de actualización, se guarda el archivo Update.ini. Primero se descarga desde FTP con el nombre local es Update_new.ini y luego compara los dos archivos. Si el número de la nueva versión es mayor que el anterior, o el nuevo archivo no está en el ini anterior, estos representan los archivos que se van a almacenar. actualizados y luego descargarlos uno por uno.
El nombre de este programa es AutoUpdate. Usted genera este archivo ejecutable y luego lo empaqueta con el programa principal. Al crear un acceso directo en el escritorio, seleccione AutoUpdate en lugar del programa principal.
También hay un archivo ini localmente, llamémoslo ftp.ini, por ejemplo. El contenido que contiene es.
[conformación]
principal=Proyecto1.exe
parámetro={aplicación}sayyes.pj2 -y bde.txt
main=Project1.exe: es el nombre del programa principal, que se encuentra en el mismo directorio que el programa de actualización.
param={app}sayyes.pj2 -y bde.txt: este es el parámetro de la línea de comando, la aplicación es la ruta actual, reemplácela en el programa y pásela al programa principal (si es necesario)
El formato del contenido de update.ini es el siguiente
[raíz]
Consulta de oficina.txt=20100519
[tarjeta db]
deciryes.pj2=20100519
Contraseña de usuario FTP.txt=20100519
[raíz] representa el directorio raíz y [dbcard] representa el subdirectorio, y así sucesivamente.
la interfaz principal de la unidad utiliza Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios, Diálogos, StdCtrls, IdHTTP, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, ComCtrls, ExtCtrls, IniFiles, ShellAPI, tipo jpeg TfrmMain = clase(TForm) IdFTP1: TIdHTTP1: TIdHTTP; ProgressBar1: TProgressBar; ld_host: TLabeledEdit; TLabeledEdit: TComboBox; TProgressBar; Label3: TLabel; list_file: TListView; Label4: TLabel; procedimiento IdFTP1Work (Remitente: TObject; AWorkMode: TWorkMode); procedimiento FormCreate (Remitente: TObject) ; privado { Declaraciones privadas } FSize:Integer; FPath: cadena; FExePath: cadena; FIniFile:TIniFile; FHandle:FrmMain: TfrmMain; *.dfm} //Descargar el procedimiento de progreso TfrmMain.IdFTP1Work(Remitente: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); comenzar ProgressBar1.Position := AWorkCount Application.ProcessMessages; procedimiento TfrmMain.IdFTP1WorkEnd(Remitente: TObject; AWorkMode: TWorkMode); comenzar ProgressBar1.Position := 0; ProgressBar2.StepBy(1); fin; procedimiento TfrmMain.FormCreate(Remitente: TObject); var frm: TfrmFlash; comenzar Self.Visible := False; no se puede agregar frm := TfrmFlash.Create( nil); frm.Show; Aplicación.ProcessMessages; FExePath: = ExtractFilePath (Aplicación.ExeName); FIniFile:= TIniFile.Create(FExePath+'ftp.ini'); //Cargar información de inicio, que es información como el host y el puerto. Pruebe ConnectFTP;Visible:= True; finalmente FreeAndNil(frm); IdFTP1.Quit; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); //Una vez completada la actualización, inicie el programa principal y pase los parámetros de la línea de comando ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate; //Verificar el procedimiento de actualización; TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; itemstr,itempath: cadena; pruebe list_file.Clear; /Primero descargue el archivo update.ini en el servidor y guárdelo en el update_new.ini local IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); si FileExists(FExePath + 'update.ini') = False entonces Salir oldFile.LoadFromFile(FExePath + 'update.ini'); .LoadFromFile(FExePath + 'update_new.ini'); ruta del elemento: = ''; // Lo siguiente comienza a comparar las dos listas. Si el número de versión de newFile es mayor que el número de versión de oldFile o no hay ningún número de versión en oldFile, significa que es necesario actualizarlo para i: = 0 a newFile. .Count - 1 comienza itemstr := newFile.Strings[i ]; si itemstr = '' entonces continúa si itemstr[1] = '[' luego comienza itempath := Copy(itemstr,2,Length(itemstr)-2 ); //Si es el directorio raíz si itempath = 'root' luego itempath := '/'; Continuar; itemstr := newFile.Names[i]; index := oldFile.IndexOfName(itemstr); .Add; item.Caption := itemstr; item.SubItems.Add(itempath) fin si no comenzar ver := StrToIntDef(newFile.Values[itemstr],0); si ver > StrToIntDef(oldFile.Values[itemstr],0) entonces comience el elemento:= list_file.Items.Add item.Caption:= itemstr; itempath); fin; fin; si list_file.Items.Count = 0 entonces Application.Terminate; oldFile.Free; newFile.Free; finalizar; función TfrmMain.ConnectFTP: booleano; comenzar Resultado: = Falso; intente IdFTP1.Text, 21); .Nombre de usuario := ld_nombre de usuario.Texto; IdFTP1.Contraseña := ld_psw.Text; IdFTP1.Connect; IdFTP1.Passive:= cb_mode.ItemIndex = 1; FInitPath:= IdFTP1.RetrieveCurrentDir Resultado:= IdFTP1.Connected; excepto Resultado:= Falso; .DownLoadFile; var i:Entero; ruta:cadena; s1,s2:Cadena; comenzar ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0; FIniFile.EraseSection('error'); 1 comienzo Label4.Caption := 'Descargando'+list_file.Items[i].Caption; IdFTP1.ChangeDir(FInitPath); ruta:= list_file.Items[i].SubItems.Strings[0]; si la ruta <>'/' entonces comienza IdFTP1.ChangeDir(path); list_file.Items[i].Caption; s2 := FExePath+ruta+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); fin si no comienza s1 := list_file.Items[i].Caption; list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); //Registrar elementos fallidos FIniFile.WriteString('error',list_file.Items[i].Caption,'Success' end; //Registrar elementos fallidos FIniFile.WriteString('error',list_file.Items[i]. Caption,'Error'); fin; fin; Label4.Caption := '¡Todos los archivos actualizados! '; DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False; procedimiento TfrmMain.LoadIni; FIniFile.ReadString('coninfo','host','******'); ld_username.Text := FIniFile.ReadString('coninfo','usuario','******'); 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'); ',''); finalizar; procedimiento TfrmMain.SaveIni; FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','usuario',ld_username.Text); FIniFile.WriteString('coninfo','psw',ld_psw.Text) ; FIniFile.WriteString('coninfo','puerto',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex fin);
Si tiene alguna pregunta, deje un mensaje o vaya a la comunidad de este sitio para comunicarse y discutir. Gracias por leer. Espero que pueda ayudar a todos. ¡Gracias por su apoyo a este sitio!