Merhabalar,
Dosya kopyalama yaparken nedenini hala anlayamadım ama birçok yöntemi çalıştıramadım.
Her zaman ki gibi gezinirken Muharrem hocamızın paylaştığı örneklerden bir tanesini daha ele geçirmiş bulunmaktayım :)
Uygulama görüntüsü:
Lafı fazla uzatmadan kodlara ve kullanımına geçmek istiyorum.
Uses DateUtils;
Var
  xboolDurdur : Boolean = False;
function DosyaKopyala( strKaynak, strHedef: String; boolUzerineYaz:Boolean; Gauge:TGauge; aLabel:TLabel): Boolean;
Var
  fsKaynak, fsHedef : TFileStream;
  Miktar : DWord;
  Buffer : Array [0..(1024*64)-1] of Byte; // 64 KByte'lık paketler halinde kopyalanacak...
  tBas   : TDateTime;
begin
  tBas   := Now;
  Result := False;
  // Kaynak Dosya Var mıdır ? Kontrolü...
  if NOT FileExists( strKaynak ) then
  begin
      MessageDlg( 'Kaynak dosya mevcut olmadığı için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      Exit;
  end;
  // Üzerine yazma izni yoksa Hedef Dosya Var mıdır ? Kontrolü...
  if NOT boolUzerineyaz then
  begin
    if FileExists( strHedef ) then
    begin
      MessageDlg( 'Hedef dosya mevcut ve üzerine yazma izni vermediğiniz için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      Exit;
    end;
  end;
  fsKaynak := TFileStream.Create( strKaynak, fmOpenRead or fmShareDenyNone );
  Try
    if Gauge <> Nil then
    begin
      Gauge.MinValue := 0;
      Gauge.MaxValue := fsKaynak.Size;
    end;
    Try
      fsHedef  := TFileStream.Create( strHedef, fmCreate  );
    Except
      MessageDlg( 'Hedef dosya oluşturulurken bir sorun olduğu için kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
      fsKaynak.Free;
      Exit;
    End;
    fsKaynak.Seek( 0, soFromBeginning );
    Miktar := SizeOf(Buffer);
    while (fsKaynak.Size - fsKaynak.Position > Miktar) AND (NOT xboolDurdur) do
    begin
      fsKaynak.Read( Buffer, Miktar );
      fsHedef.Write( Buffer, Miktar );
      if Gauge <> Nil then Gauge.Progress  := fsKaynak.Position;
      if aLabel <> Nil then aLabel.Caption := Format('Miktar: %d / %d Kb'
                                                    + #13'GeçenSüre: %d saniye'
                                                    + #13'Tahmini Sure: %d saniye'
                                                    + #13'Tahmini KalanSüre: %d saniye', [
               fsKaynak.Position div (1024)
            ,  fsKaynak.Size     div (1024)
            ,  SecondsBetween(Now, tBas)
            , (SecondsBetween(Now, tBas) * fsKaynak.Size) div (fsKaynak.Position)
            , (SecondsBetween(Now, tBas) * fsKaynak.Size) div (fsKaynak.Position) - SecondsBetween(Now, tBas) ]);
      Application.ProcessMessages;
    end;
    if NOT xboolDurdur then
    begin
      Miktar := fsKaynak.Size - fsKaynak.Position + 1;
      if Miktar > 0 then
      begin
        fsKaynak.Read( Buffer, Miktar );
        fsHedef.Write( Buffer, Miktar );
      end;
      if Gauge <> Nil then Gauge.Progress := fsKaynak.Position;
    end else
    begin
      MessageDlg( 'İsteğiniz üzerine kopyalama işlemi durdururldu...', mtWarning, [mbOk], 0);
    end;
    fsKaynak.Free;
    fsHedef.Free;
  Finally
    Result := True;
  End;
end;
Kullanımı
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  KaynakDosya,
  HedefDosya   : String;
begin
  if TBitBtn(Sender).Caption = 'Başlat' then
  begin
    xboolDurdur := False;
    TBitBtn(Sender).Caption := 'Durdur';
    KaynakDosya := 'd:\ARMAN-Genel\Movies\Avengers\Avengers,The.(Yenilmezler).TR.BRRip.XviD.avi';
    HedefDosya  := 'd:\test.avi';
    if DosyaKopyala( KaynakDosya, HedefDosya, True, Gauge1, Label1 ) AND ( NOT xboolDurdur )
      then MessageDlg('Kopyalama işlemi başarıyla tamamlandı...', mtInformation, [mbOk], 0)
      else if ( NOT xboolDurdur ) then MessageDlg('Kopyalama işlemi yapılamadı...', mtError, [mbOk], 0);
  end else
  begin
    xboolDurdur := True;
    TBitBtn(Sender).Caption := 'Başlat';
  end;
end;
EK Bilgi : - Kopyalamak için herhangi bir TGauge veya TLabel kullanmak istemezseniz
DosyaKopyala( KaynakDosya, HedefDosya, True, Nil, Nil )
şeklinde parametre olarak Nil yazarak kullanabilirsiniz.