PDA

Ver la Versión Completa : Actualizar Archivos Desde FTP


papu24ar
19-03-2007, 06:55:39
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 (http://www.clubdelphi.com/foros/search.php).
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)

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
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 (http://www.clubdelphi.com/trucos/index.php?id=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
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 (http://www.clubdelphi.com/trucos/index.php?id=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 :(