Ĺadny brzuch
Znalazłem w sieci taki kod ( dostosowałem go do swoich potrzeb):
type TCRFileStream = class(TFileStream) public function CopyRest(Source: TStream): Int64; end; implementation function TCRFileStream.CopyRest(Source: TStream): Int64; const MaxBufSize = $F000; var BufSize, N: Integer; Buffer: PChar; Pos: Int64; begin Pos := source.Size - Size; Source.Seek(Pos*-1,soFromEnd); Seek(0,soFromEnd); Result := Pos; if Pos > MaxBufSize then BufSize := MaxBufSize else BufSize := Pos; GetMem(Buffer, BufSize); try while Pos <> 0 do begin if Pos > BufSize then N := BufSize else N := Pos; Source.ReadBuffer(Buffer^, N); WriteBuffer(Buffer^, N); Dec(Pos,N); end; finally FreeMem(Buffer, BufSize); end; end; end. procedure TForm1.Button1Click(Sender: TObject); var read, write : TCRFileStream; plik1, plik2 : TFileName; begin plik1 := 'C:\1.txt'; plik2 := 'C:\folder\1.txt'; try read := TCRFileStream.Create(plik1,fmOpenRead or fmShareDenyNone); if FileExists(plik2) then begin if application.messagebox(' ',' ', MB_yesNo)=ID_NO then exit; try write := TCRFileStream.Create(plik2,fmCreate); write.CopyFrom(read,0); finally write.Free; end; end; finally read.Free; end; end;
Mam taki problem - chciałbym wykorzystać go w mojej aplikacji, ale:
aplikacja przestaje odpowiadać na czas kopiowania - gdzie umieścić (application.processMessages);
jak sprawdzić, ile pliku się skopiowało ( chcę to wykorzystać w progressBarze)
Dzięki za pomoc!
Użytkownik Bełdzio edytował ten post 06 czerwiec 2005, 10:45
A nie lepiej po prostu CopyFile() ?? ale jak lubisz..
try while Pos <> 0 do begin if Pos > BufSize then N := BufSize else N := Pos; Source.ReadBuffer(Buffer^, N); WriteBuffer(Buffer^, N); Dec(Pos,N); application.processmessages; //tutaj end;
1. ProcessMessages daj w OnCreate imho lepiej daj ten kod jako osobny wątek
2. co do zliczania do zrób sobie nową zmienną i na końcu pętli daj Inc(zmienna), albo pobaw się z Pos
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
type TCRFileStream = class(TFileStream) public function CopyRest(Source: TStream): Int64; end; implementation function TCRFileStream.CopyRest(Source: TStream): Int64; const MaxBufSize = $F000; var BufSize, N: Integer; Buffer: PChar; Pos: Int64; begin Pos := source.Size - Size; Source.Seek(Pos*-1,soFromEnd); Seek(0,soFromEnd); Result := Pos; if Pos > MaxBufSize then BufSize := MaxBufSize else BufSize := Pos; GetMem(Buffer, BufSize); try while Pos <> 0 do begin if Pos > BufSize then N := BufSize else N := Pos; Source.ReadBuffer(Buffer^, N); WriteBuffer(Buffer^, N); Dec(Pos,N); end; finally FreeMem(Buffer, BufSize); end; end; end. procedure TForm1.Button1Click(Sender: TObject); var read, write : TCRFileStream; plik1, plik2 : TFileName; begin plik1 := 'C:\1.txt'; plik2 := 'C:\folder\1.txt'; try read := TCRFileStream.Create(plik1,fmOpenRead or fmShareDenyNone); if FileExists(plik2) then begin if application.messagebox(' ',' ', MB_yesNo)=ID_NO then exit; try write := TCRFileStream.Create(plik2,fmCreate); write.CopyFrom(read,0); finally write.Free; end; end; finally read.Free; end; end;
Mam taki problem - chciałbym wykorzystać go w mojej aplikacji, ale:
aplikacja przestaje odpowiadać na czas kopiowania - gdzie umieścić (application.processMessages);
jak sprawdzić, ile pliku się skopiowało ( chcę to wykorzystać w progressBarze)
Dzięki za pomoc!
Użytkownik Bełdzio edytował ten post 06 czerwiec 2005, 10:45
A nie lepiej po prostu CopyFile() ?? ale jak lubisz..
try while Pos <> 0 do begin if Pos > BufSize then N := BufSize else N := Pos; Source.ReadBuffer(Buffer^, N); WriteBuffer(Buffer^, N); Dec(Pos,N); application.processmessages; //tutaj end;
1. ProcessMessages daj w OnCreate imho lepiej daj ten kod jako osobny wątek
2. co do zliczania do zrób sobie nową zmienną i na końcu pętli daj Inc(zmienna), albo pobaw się z Pos