Interesuje mnie taka procedura, która zarazem kopiowałaby pliki i ograniczała prędkość kopiowania. W ten sposób możnaby było, będąc offline, zasymulować kopiowanie pliku z netu, np. przy modemie 56kbps lub ograniczyć prędkość kopiowania pliku do 20 kB\s. Wiem, iż moja prośba to ewidentny paradoks, bo ludzie chcą, aby było ciągle szybciej, ale takie coś mogłoby się czasem przydać... np. przy tworzeniu stron WWW, bądź tak dla frajdy [hurra]. Anybody knows?
0
0
To jest procedurka z unitu FMXUtils (chyba z Delphi3 ją mam). Wystarczy pokombinować np. ze Sleep(), lub wstawić pętelkę repeat w timer. Robiłem kiedyś z użyciem tej procki progs do kopiowania plików z określoną prędkością. Źródła niestety już nie mam, ale wstawiłem w pętli Sleep() z odpowiednio obliczoną ilością milisekund i w miarę to ciekało.
procedure CopyFile(const FileName, DestName: string);
var
CopyBuffer: Pointer; { buffer for copying }
BytesCopied: Longint;
Source, Dest: Integer; { handles }
Len: Integer;
Destination: TFileName; { holder for expanded destination name }
const
ChunkSize: Longint = 8192; { copy in 8K chunks }
begin
Destination := ExpandFileName(DestName); { expand the destination path }
if HasAttr(Destination, faDirectory) then { if destination is a directory... }
begin
Len := Length(Destination);
if Destination[Len] = '' then
Destination := Destination + ExtractFileName(FileName) { ...clone file name }
else
Destination := Destination + '' + ExtractFileName(FileName); { ...clone file name }
end;
GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
try
Source := FileOpen(FileName, fmShareDenyWrite); { open source file }
if Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]);
try
Dest := FileCreate(Destination); { create output file; overwrite existing }
if Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]);
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
if BytesCopied > 0 then { if we read anything... }
FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
until BytesCopied < ChunkSize; { until we run out of chunks }
finally
FileClose(Dest); { close the destination file }
end;
finally
FileClose(Source); { close the source file }
end;
finally
FreeMem(CopyBuffer, ChunkSize); { free the buffer }
end;
end;
0
danx
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.