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.
Hiç yorum yok:
Yorum Gönder