копирование файлов [Решено]

Вопросы программирования и использования среды Lazarus.

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

Ответить
novo
новенький
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

копирование файлов [Решено]

Сообщение novo »

Доброго времени)

Есль вот такой код для копирования с использованием progressbar, пример взят из http://www.freepascal.ru/forum/viewtopic.php?f=13&t=7576

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

procedure TNewThread.progress;
begin
 form1.ProgressBar1.Position:=progr;
 form1.Label1.Caption:=inttostr(progr)+'%';
 form1.Label2.Caption:=timetostr(tm);
end;

procedure TNewThread.Execute;
var
  FromStream, ToStream: TFileStream;
  buff : Int64=64;
  Fss:integer;
  FromFile, ToFile: TFileName;
  tm_old:Ttime;
begin
FromFile:=utf8toansi(form1.Edit1.Text);
ToFile:=utf8toansi(form1.Edit2.Text+'\'+ExtractFileName(form1.Edit1.Text));
  if not FileExists(FromFile) then begin
   showmessage('File not Exists');
  Exit;
  end;
  try
  FromStream := TFileStream.Create(FromFile, fmOpenRead);
    ToStream := TFileStream.Create(ToFile, fmCreate);
      form1.ProgressBar1.min:=0;
      form1.ProgressBar1.Max:=100;
      Fss:= FromStream.Size;
      tm_old:=time;     
     while ToStream.Size < Fss do begin
        ToStream.CopyFrom(FromStream, buff);
       progr:=round((ToStream.Size*100)/Fss);
       tm:=time-tm_old;   
        Synchronize(@progress);
      end;
     finally
     ToStream.Free;
    FromStream.Free;
     end;
end;


Помогите подправить, а то в конце выдает исключение EReadError Stream Read Error
Я так понял, что это связано с указанием неправильного размера буфера, такая мысль возникла после попытки установить buff:=1

Заранее спасибо)
Последний раз редактировалось novo 31.03.2012 18:16:05, всего редактировалось 1 раз.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Косяг было разбираться в коде, тупо набросал свою реализацию, смотри что не так у тебя... я копирую по 1 проценту.. от размера файла
Размер можно указывать любым просто нужно расчитать правильно приращения для прогресбара... так же нужно использовать utf8tosys и обратные ей функции для преобразования русских имен.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
novo
новенький
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Сообщение novo »

Решено, теперь буду думать как оптимизировать

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

var
  FromStream, ToStream: TFileStream;
  buff : Int64;
  Fss:integer;
  FromFile, ToFile: TFileName; 
  summa:integer=0;
begin
  try
  FromStream := TFileStream.Create(FromFile, fmOpenRead);
    ToStream := TFileStream.Create(ToFile, fmCreate);

      Fss:= FromStream.Size;
      buff:=Fss div 100;
     
     while ToStream.Size < Fss do begin
       summa:=summa+buff;
        ToStream.CopyFrom(FromStream, buff);
       progr:=round((ToStream.Size*100)/Fss);
       if progr=99 then buff:=fss-summa;         
        Synchronize(@progress);
      end;
     finally
     ToStream.Free;
    FromStream.Free;
     end;


Добавлено спустя 3 минуты 34 секунды:
Maxizar писал(а):Косяг было разбираться в коде, тупо набросал свою реализацию, смотри что не так у тебя... я копирую по 1 проценту.. от размера файла
Размер можно указывать любым просто нужно расчитать правильно приращения для прогресбара... так же нужно использовать utf8tosys и обратные ей функции для преобразования русских имен.

Спасибо)
Ответить