Jak skopiować plik, aby jego postęp był pokazywany na ProgressBar

Adam Boduch

Można skorzystać z poniższego kodu:

procedure TMain.CopyClick(Sender: TObject);
const
  SrcPath = 'C:flash.rar';
  DstPath = 'C:flash-kopia.rar';
var
  Src, Dst : File;
  FSize : Integer;
  RealSize : Integer;
  Buffer: array[0..1024] of char;
  TotalSize : Integer;
begin
  TotalSize := 0;
  AssignFile(Src, SrcPath);
  try
    Reset(Src, 1); // otwieramy plik źródłowy
    AssignFile(Dst, DstPath);
    try
      ReWrite(Dst, 1);  // tworzymy nowy plik
      FSize := FileSize(Src);  // określamy rozmiar pliku źródłowego
      Progress.Max := FSize;
     { pętla odczytuje określone porcje danych a następnie te porcje
       zapisuje do nowego pliku }
      repeat
      // odczytaj 1 kB danych
        BlockRead(Src, Buffer, SizeOf(Buffer), RealSize);

        if RealSize > 0 then  // jeżeli odczytany rozmiar jest większy od zera...
        begin
        { dodaj do zmiennej TotalSize }
          TotalSize := TotalSize + RealSize;
        { zapisz odczytaną porcję danych do pliku przeznaczenia }
          BlockWrite(Dst, Buffer, RealSize);
          Progress.Position := TotalSize;
        end;
      until RealSize = 0;
    finally
      CloseFile(Dst);
    end;
  finally
    CloseFile(Src);
  end;
end;
 

FAQ

3 komentarzy

A chcac uzyskać taki efekt ale podczas kopiowania plikow z zasobow na hdd to co musze zrobić ??

Exar Kun napisał :-)
mi nie dziala blad wyskakuje przy linii
Progress.Max := FSize;
co robic?

Wrzuć na formę progrssbar, zmień jego nazwę na progress i daj ten kod np. w onclick button :

const
 SrcPath = 'D:innesuperbeleg.gif';
 DstPath = 'D:kupa.gif';
var
 Src, Dst : File;
 FSize : Integer; 
 RealSize : Integer;
 Buffer: array[0..1024] of char; 
 TotalSize : Integer;
begin 
 TotalSize := 0;
 AssignFile(Src, SrcPath); 
 try
  Reset(Src, 1); // otwieramy plik źródłowy
  AssignFile(Dst, DstPath); 
  try
   ReWrite(Dst, 1); // tworzymy nowy plik
   FSize := FileSize(Src); // określamy rozmiar pliku źródłowego
   Progress.Maxvalue := FSize;
   { pętla odczytuje określone porcje danych a następnie te porcje 
    zapisuje do nowego pliku } 
   repeat
   // odczytaj 1 kB danych 
    BlockRead(Src, Buffer, SizeOf(Buffer), RealSize); 

    if RealSize > 0 then // jeżeli odczytany rozmiar jest większy od zera...
    begin 
    { dodaj do zmiennej TotalSize }
     TotalSize := TotalSize + RealSize;
    { zapisz odczytaną porcję danych do pliku przeznaczenia }
     BlockWrite(Dst, Buffer, RealSize);
     Progress.Progress := TotalSize; 
    end;
   until RealSize = 0; 
  finally
   CloseFile(Dst); 
  end;
 finally
  CloseFile(Src);
 end;
end;


mi nie dziala blad wyskakuje przy linii

Progress.Max := FSize;

co robic?