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.