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

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

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

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

Сообщение minoshi » 23.11.2011 18:39:04

Доброго времени суток!

Тут потребовалось реализовать копирование файлов с отображением процесса копирования отдельного файла на 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
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение stikriz » 23.11.2011 19:47:54

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

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

Сообщение Sergei I. Gorelkin » 23.11.2011 19:50:26

Задать можно любой размер (больше данных, чем есть в исходном файле, оно все равно не скопирует), но внутри TStream.CopyFrom есть свой буфер, который сравнительно недавно был увеличен с 1 кБайт до 128 кБайт.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение minoshi » 23.11.2011 20:02:35

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


то, что надо.

Спасибо.

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

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


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


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15

Рейтинг@Mail.ru