Ver Mensaje Individual
  #4  
Antiguo 28-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Reputación: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Se me ocurre que utilizes el evento "OnWorkEnd" del componente "TIdHttp". Dicho evento se disparará cuando se complete la descarga. En el mismo puedes comprobar el tamaño del archivo con el tamaño de la descarga. Lo primero puedes conseguirlo con el truco "Tamaño real de un archivo" que encuentras aquí mismo en el ClubDelphi. Lo segundo puedes conseguirlo echando un vistazo a la propiedad "IdHTTP.Response.ContentLength".

La cosa podría quedar más o menos así en el evento susomentado:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP: TIdHTTP;
    bProgresoDescarga: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
    procedure IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetSizeOfFile(const Filename:string): Int64;
var Sr:TSearchRec;
begin
  try
    if FindFirst(FileName,faAnyFile,sr) <> 0 then
      raise Exception.Create('Archivo ' + FileName+' no encontrado');
    Result:= sr.FindData.nFileSizeHigh * maxdword + sr.Finddata.nFileSizeLow;
  finally
    FindClose(sr);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create('C:\archivo.zip', fmCreate);
  try
    IdHTTP.Get('http://www.loturak.es/zip/loturak_0.9.zip', fs);
  finally
    fs.Free;
  end;
end;

procedure TForm1.IdHTTPWorkBegin(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  bProgresoDescarga.Max := IdHTTP.Response.ContentLength;
end;

procedure TForm1.IdHTTPWork(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  bProgresoDescarga.Position := AWorkCount;
end;

procedure TForm1.IdHTTPWorkEnd(Sender: TObject;
 AWorkMode: TWorkMode);
var
  tamanoArchivo: Int64;
  tamanoDescarga: Int64;
begin
  tamanoArchivo := GetSizeOfFile('C:\archivo.zip');
  tamanoDescarga := IdHTTP.Response.ContentLength;
  if (tamanoArchivo = tamanoDescarga) then
    ShowMessage('Descarga terminada con éxito')
  else
    ShowMessage('Hubo algún problema con la descarga');
end;

end.

El único problema que se me ocurre es que el Servidor no retorne el "ContentLength" del archivo. No es lo habitual, pero, puede suceder. Tendrías que hacer pruebas en tu caso. Es lo que se me ocurre a bote pronto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita