danielmj,
Cita:
Empezado por danielmj
...ProgressBar y archivo mayor o igual 2Gb...TProgressBar, está fuera de rango...¿que opción me queda para usarla con archivos grandes?...
|
Revisa este código:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
OpenDialog : TOpenDialog;
F1, F2 : TFileStream;
Buffer : String;
MsgProcess : String;
CountRead : Integer;
CountWrite : Integer;
begin
OpenDialog := TOpenDialog.Create(self);
OpenDialog.InitialDir := 'C:\';
OpenDialog.Options := [ofFileMustExist];
OpenDialog.Filter := 'All Files|*.*';
OpenDialog.FilterIndex := 1;
ProgressBar1.Min := 0;
ProgressBar1.Max := 100;
ProgressBar1.Position := 0;
if OpenDialog.Execute then
begin
try
F1 := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
F2 := TFileStream.Create('BK-' + ExtractFileName(OpenDialog.FileName), fmCreate);
SetLength(Buffer, 1024);
while F1.Position < F1.Size do
begin
CountRead := F1.Read(Buffer[1], 1024);
CountWrite := F2.Write(Buffer[1], CountRead);
ProgressBar1.Position := Trunc((F1.Position/F1.Size)*100);
Application.ProcessMessages;
end;
MsgProcess := 'Respaldo del Archivo ' + OpenDialog.FileName + ' Finalizado Satisfactoriamente';
MessageDlg(MsgProcess, mtInformation, [mbOK], 0);
except
MessageDlg('Error de I/O', mtError, [mbOK], 0);
end;
F1.Free;
F2.Free;
OpenDialog.Free;
end;
end;
El código anterior
permite leer y copiar archivos de un tamaño en bytes de 2^63 - 1 = 9.223.372.036.854.775.807 (Int64), en porciones de 1024 bytes y mostrar el progreso del mismo por medio de un componente TProgressbar normalizado en un rango de 1 a 100.
La clave esta en la ecuación:
ProgressBar1.Position := Trunc((F1.Position/F1.Size)*100);
Nota: El código fue probado con
archivos menores a 2 GB y mayores a 2GB funcionando en todos los casos correctamente.
Espero sea útil
Nelson.