Страница 1 из 1

Копирование файлов с прогрессом - определение размера буфера

СообщениеДобавлено: 23.11.2011 18:39:04
minoshi
Доброго времени суток!

Тут потребовалось реализовать копирование файлов с отображением процесса копирования отдельного файла на progressbar`e. Пошукав в закромах родины нашел примерчик
Код: Выделить всё
function MyCopyFile(FromFile, ToFile: TFileName): Boolean;
var
  FromStream, ToStream: TFileStream;
  buff : integer;
begin
  Result := True;
  if not FileExists(FromFile) then begin
    Result := False;
    Exit;
  end;
  buf := 64;
  FromStream := TFileStream.Create(FromFile, fmRead);
  try
    ToStream := TFileStream.Create(ToFile, fmCreate);
    try
      //ProgressBar1.Max := FromStream.Size;
      while ToStream.Size < FromStream.Size do begin
        ToStream.CopyFrom(FromStream, buff);
        //сдесь чё-нить с прогрессом делаем (увеличиваем)
        //Application.ProcessMessages;
      end;
    finally
      ToStream.Free;
    end;
  finally
    FromStream.Free;
  end;
end;


Данный пример вполне отвечает поставленной задаче. Но вопрос все-таки возник - экспериментально выявлено, что при увеличении значения переменой buff - увеличивается скорость копирования.
Так вот, как узнать максимальный размер буфера, который можно задать?

Целевая платформа - linux, х86

Re: Копирование файлов с прогрессом - определение размера бу

СообщениеДобавлено: 23.11.2011 19:47:54
stikriz
При увеличении buff не так часто надо перерисовывать прогрессбар - скорость растет :-)
Все равно перезапись идет через буфер оси. В винде ~ 64Кб.
Вот это:
Код: Выделить всё
while ToStream.Size < FromStream.Size
- нехорошо.
Лучше сразу узнать сколько байтиков в исходном файле один раз, а потом уменьшать на к-во переписаного до нуля.

Re: Копирование файлов с прогрессом - определение размера бу

СообщениеДобавлено: 23.11.2011 19:50:26
Sergei I. Gorelkin
Задать можно любой размер (больше данных, чем есть в исходном файле, оно все равно не скопирует), но внутри TStream.CopyFrom есть свой буфер, который сравнительно недавно был увеличен с 1 кБайт до 128 кБайт.

Re: Копирование файлов с прогрессом - определение размера бу

СообщениеДобавлено: 23.11.2011 20:02:35
minoshi
Sergei I. Gorelkin писал(а):внутри TStream.CopyFrom есть свой буфер, который сравнительно недавно был увеличен с 1 кБайт до 128 кБайт.


то, что надо.

Спасибо.

Добавлено спустя 2 минуты 7 секунд:

stikriz писал(а): Вот это: --- нехорошо.


Да это понятно, но тоже спасибо