Ograniczanie.. prędkości kopiowania

0

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

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.