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

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

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

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

Сообщение novo » 31.03.2012 15:47:55

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

Есль вот такой код для копирования с использованием 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 раз.
novo
новенький
 
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Re: копирование файлов

Сообщение Maxizar » 31.03.2012 16:43:18

Косяг было разбираться в коде, тупо набросал свою реализацию, смотри что не так у тебя... я копирую по 1 проценту.. от размера файла
Размер можно указывать любым просто нужно расчитать правильно приращения для прогресбара... так же нужно использовать utf8tosys и обратные ей функции для преобразования русских имен.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: копирование файлов

Сообщение novo » 31.03.2012 18:15:22

Решено, теперь буду думать как оптимизировать
Код: Выделить всё
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 и обратные ей функции для преобразования русских имен.

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


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 254

Рейтинг@Mail.ru