Ver Mensaje Individual
  #8  
Antiguo 27-09-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 27-09-2013 a las 04:41:16.
Responder Con Cita