Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Actualizar Archivos Desde FTP (https://www.clubdelphi.com/foros/showthread.php?t=41545)

papu24ar 19-03-2007 06:55:39

Actualizar Archivos Desde FTP
 
Bueno la idea es actualizar un programa.. basicamente buscando en el foro lo q encontre es como actualizar el ejecutable del programa yo lo que quiero es actualizar archivos ajenos al ejecutable.. tengo lo de la lectura del txt y si da distinta vercion sigue la actualizacion y si es la misma ahi se frena... eso lo entendi y lo pude hacer funiconar.. lo q yo kiero es:

1. que lea el archivo ese
2. si es distinta vercion que siga la actualizacion
3. q se conecte a una carpeta de el ftp por ejemplo ftp:\\misitio.com\prueba1\ y descargue todo el contenido tanto carpetas como sub carpetas
4. que copie los archivos descargados a la ruta donde esta el programa remplazando los anteriores

la idea seria mas o menos esa.. si me pueden echar una mano les agradeceria :) encontre por ahi un ejemplo con winzip pero no me gusto por q casi nadie usa winzip casi todos le dan al winrar y eso...

Neftali [Germán.Estévez] 19-03-2007 12:30:48

Busca en los foros. Link.
El tema de la actualización de programas ya se ha tratado varias veces. En los hilos también recuerdo que hay códigi, así que tal vez ya tengas resuelto el problema.

En la sección de Trucos, tienes el 55 (se Seoane) que también puede ser que te sea útil.

papu24ar 20-03-2007 07:38:20

si osea.. ya los habia visto pero keria hacerlo por ftp y descargar fila por fila.. no un solo zip.. pero ya lo solucione eso.. ahora lo que me gustaria que me dijeran es como hago para ponerle un progress bar a este codigo para saber cuando se completa la descarga y si se puede saber la velocidad de descarga. por que me vengo kemando la cabeza desde ayer mirando ejemplos y todo pero no entiendo :S (Sorry soy bastante nuevo)

Código:

Código Delphi [-]
procedure TfMenu.chk_nuevas_versionesClick(Sender: TObject);
// poner en uses:  WinInet, Registry, WinSock, StrUtils,  urlMon;
var
 vInst:string;      // almacena la versión instalada en el PC
dir_exe:String;    // carpeta desde la que se ejecuta el *.exe
dir_tmp:String;    // carpeta temporal, utilizada para descargar los ficheros
fic_web_txt:String;// ruta para descargar fichero txt con la versión
fic_pc_txt:String; // ruta en el pc donde se ha descargado fichero txt con la versión
fic_web_zip:String;// ruta para descargar fichero ZIP con la actualización
fic_pc_zip:String; // ruta en el pc donde se ha descargado fichero ZIP con la actualización
params:string;    // parametros utilizados para decir a WINZIP como descargar el fichero
nom_apli:String// nombre de la aplicación
msg:string;        // variable para almacenar los mensajes
b:Boolean;
 TS:TStrings;      // TStringList creada para leer el fichero
Str:String;        // versión instalada en el Servidor
fec:String;        // fecha de la nueva versión
titulo:String;
 //----------------------------------------------------------------------------
function DownloadFile(Source, Dest: string): Boolean;// función para descargar
  begin
    try
      Source := AnsiReplaceStr(Source, '/', '\');
      Result := UrlDownloadToFile(nil, PChar(Source), PChar(Dest), 0, nil) = 0;
    except
      Result := False;
    end;
  end;
 //----------------------------------------------------------------------------
function  GetAppVersion:string; // función para obtener la versión instalada
  var
    Size, Size2: DWord;
    Pt, Pt2: Pointer;
  begin
    Size := GetFileVersionInfoSize(PChar (ParamStr (0)), Size2);
    if Size > 0 then
    begin
      GetMem (Pt, Size);
      try
          GetFileVersionInfo (PChar (ParamStr (0)), 0, Size, Pt);
          VerQueryValue (Pt, '\', Pt2, Size2);
          with TVSFixedFileInfo (Pt2^) do
          begin
            Result:= IntToStr (HiWord (dwFileVersionMS)) + '.' +
                    IntToStr (LoWord (dwFileVersionMS)) + '.' +
                    IntToStr (HiWord (dwFileVersionLS)) + '.' +
                    IntToStr (LoWord (dwFileVersionLS));
        end;
      finally
        FreeMem (Pt);
      end;
    end;
  end;
  //----------------------------------------------------------------------------
begin


// ini: Solo se deben modificar estas variables para adaptarlas a nuestra aplicación
  nom_apli  := 'VISOR';
  dir_tmp    := 'c:\temp';
  fic_web_txt:= 'http://www.paginaweb.es/ficheros/version_visor.txt';
  fic_pc_txt := 'c:\temp\version_visor.txt';
  fic_web_zip:= 'http://www.paginaweb.es/ficheros/visor_act.zip';
  fic_pc_zip := 'c:\temp\visor_act.zip';
  params    := '-e -o '+fic_pc_zip;  // -e = extract -o = sobreescribir
// fin:

//    notas sobre parametros pasados al Winzip
//    -a add/replace files
//    -e extract /descomprimir ficheros
//    -f actualiza ficheros en destino
//    -t test archive
//    -o  no pregunta si queremos sobreecribir el fichero

  vInst:= GetAppVersion;                // obtener la versión instalada
  dir_exe:=ExtractFilePath(paramstr(0)); // el directorio del ejecutable a actualizar

  If not DirectoryExists(dir_tmp) then
  if not createdir(dir_tmp) then
    begin
    raise exception.create('Proceso cancelado al no poder creárse la carpeta '+dir_tmp);
    exit;
    end;
  // descargamos el fichero de texto con información de la última versión
  b := DownloadFile(fic_web_txt,fic_pc_txt);

  if (b) then begin
    TS := TStringList.Create();
    TS.LoadFromFile(fic_pc_txt);
    Str := TS[0];// 1º linea del fichero, poner la versión del programa, ejem. 6.1.0.2
    fec := TS[1];// 2º linea del fichero, poner la fecha de la versión,  ejem. 14-11-2006
    TS.Free;
    DeleteFile(fic_pc_txt);
    msg:= 'Versión en este ordenador: '+ vInst+#13+
          'Versión en el Servidor____: ' + Str+' de '+fec;

          if vInst<>Str then  // si las versiones son distintas
          begin
          msg:=msg+#13+#13+'Quieres descargar la nueva versión';

        titulo:='Descargar actualización '+nom_apli;
        if application.MessageBox (pchar(msg),
        PCHAR(titulo),
        (MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION)) <> IDYES then exit;

          DownloadFile(fic_web_zip,fic_pc_zip);

          msg:=  'Ha descargado la nueva actualización, '+#13+
                'al directorio '+dir_tmp+', para instalarla'+#13+
                'en su ordenador no debe haber ningún'+#13+
                'usuario conectado a la aplicación.'+#13+#13+
                'Quiere instalar la nueva versión';

          titulo:='Actualizar '+nom_apli;
          if application.MessageBox (pchar(msg),
            PCHAR(titulo),
            (MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION)) <> IDYES then exit;
                begin
                ShellExecute(Handle, 'Open', 'WinZip32.exe', PCHAR(params), PCHAR(dir_exe), SW_NORMAL);
                Application.Terminate;
                end;
          end
          else
  Application.MessageBox((pChar(msg+#13+#13+'NO HAY NUEVAS ACTUALIZACIONES')) , 'Comprobación versiones', MB_ICONEXCLAMATION) ;
end
else
  ShowMessage('Esta comprobación solo se puede hacer'+#13+
              'en ordenadores conectados a Internet.'+#13+
              'Su equipo no tiene esta conexión'+#13+
              '- Proceso Cancelado -');
end;

Muchas Gracias por toda su ayuda :)

seoane 20-03-2007 14:23:53

Cita:

Empezado por papu24ar
ahora lo que me gustaria que me dijeran es como hago para ponerle un progress bar a este codigo para saber cuando se completa la descarga y si se puede saber la velocidad de descarga.

Usando UrlDownloadToFile no puedes, ya que la función no termina hasta que se ha bajado todo el archivo. Para eso tienes que usar Indy o Wininet.

Por ejemplo en el truco 55 del que te hablo Neftali, en la parte que aparece comentada la sentencia "Application.ProcessMessages", insertas el código necesario para actualizar una barra de progreso y descomentas el "Application.ProcessMessages". Para actualizar la barra y determinar la velocidad solo tienes que tener en cuenta los bytes descargados y el tiempo transcurrido.

papu24ar 21-03-2007 03:50:57

Cita:

Empezado por seoane
Usando UrlDownloadToFile no puedes, ya que la función no termina hasta que se ha bajado todo el archivo. Para eso tienes que usar Indy o Wininet.

Por ejemplo en el truco 55 del que te hablo Neftali, en la parte que aparece comentada la sentencia "Application.ProcessMessages", insertas el código necesario para actualizar una barra de progreso y descomentas el "Application.ProcessMessages". Para actualizar la barra y determinar la velocidad solo tienes que tener en cuenta los bytes descargados y el tiempo transcurrido.

mira estube mirando el codigo ayer.. y hoy estube analizando como poner el progressbar.. la verdad no encontre informacion al respecto y lo unico q se me ocurre es lo siguiente..

procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: array[0..10240] of Char;
BytesRead: DWORD;
BytesWritten: DWORD;
begin
Bajar('
http://www.tusitio.com\1.jpg','d:\1.jpg');
ProgressBar1.Max := sizeof(Buffer);
ProgressBar1.Position := BytesRead;
end;

y funciona.. pero osea la barra se mantiene vacia y se completa cuando finaliza la descarga :S si me podrias echar una ayudita te lo agredeceria demaciado.. y disculpa mi insistencia.. pasa q soy bastante novato

sorry :(


La franja horaria es GMT +2. Ahora son las 11:02:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi