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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
minoshi
постоялец
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение 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
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

При увеличении buff не так часто надо перерисовывать прогрессбар - скорость растет :-)
Все равно перезапись идет через буфер оси. В винде ~ 64Кб.
Вот это:

Код: Выделить всё

while ToStream.Size < FromStream.Size 
- нехорошо.
Лучше сразу узнать сколько байтиков в исходном файле один раз, а потом уменьшать на к-во переписаного до нуля.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Задать можно любой размер (больше данных, чем есть в исходном файле, оно все равно не скопирует), но внутри TStream.CopyFrom есть свой буфер, который сравнительно недавно был увеличен с 1 кБайт до 128 кБайт.
Аватара пользователя
minoshi
постоялец
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Сообщение minoshi »

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


то, что надо.

Спасибо.

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

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


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