Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Скопировать файл с заполнением своего ProgressBara

Delphi , Файловая система , Файлы

Скопировать файл с заполнением своего ProgressBara

Автор: Xavier Pacheco

{
Copyright © 1999 by Delphi 5 Developer's Guide - Xavier Pacheco and Steve Teixeira
}

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ComCtrls, Gauges;

type
  TMainForm = class(TForm)
    prbCopy: TProgressBar;
    btnCopy: TButton;
    procedure btnCopyClick(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.btnCopyClick(Sender: TObject);
var
  SrcFile, DestFile: file;
  BytesRead, BytesWritten, TotalRead: Integer;
  Buffer: array[1..500] of byte;
  FSize: Integer;
begin
  { Assign both the source and destination files to their
    respective file variables }
  AssignFile(SrcFile, 'srcfile.tst');
  AssignFile(DestFile, 'destfile.tst');
  // Open the source file for read access.
  Reset(SrcFile, 1);
  try
    // Open destination file for write access.
    Rewrite(DestFile, 1);
    try
      { Encapsulate this into a try..except so that we can erase the file if
        an error occurs. }
      try
        // Initialize total bytes read to zero.
        TotalRead := 0;
        // Obtain the filesize of the source file
        FSize := FileSize(SrcFile);
        { Read SizeOf(Buffer) bytes from the source file
          and add these bytes to the destination file. Repeat this
          process until all bytes have been read from the source
          file. A progress bar is provided to show the progress of the
          copy operation. }
        repeat
          BlockRead(SrcFile, Buffer, SizeOf(Buffer), BytesRead);
          if BytesRead > 0 then
          begin
            BlockWrite(DestFile, Buffer, BytesRead, BytesWritten);
            if BytesRead <> BytesWritten then
              raise Exception.Create('Error copying file')
            else
            begin
              TotalRead := TotalRead + BytesRead;
              prbCopy.Position := Trunc(TotalRead / Fsize) * 100;
              prbCopy.Update;
            end;
          end
        until BytesRead = 0;
      except
        { On an exception, erase the destination file as it may be
          corrupt. Then re-raise the exception. }
        Erase(DestFile);
        raise;
      end;
    finally
      CloseFile(DestFile); // Close the destination file.
    end;
  finally
    CloseFile(SrcFile); // Close the source file.
  end;
end;

end.

Here's a translation of the content into Russian:

Главная форма

Главная форма (TMainForm) имеет два компонента: prbCopyTProgressBar) и btnCopyTButton). Когда кнопка btnCopy нажата, программа начинает копировать файл.

Процедура копирования файла

Процедура TMainForm.btnCopyClick вызывается при нажатии кнопки btnCopy. Она выполняет следующие шаги:

  1. Назначает два переменных-файла (SrcFile и DestFile) для источника и назначения файлов, соответственно.
  2. Открывает источник файла для чтения с помощью Reset( SrcFile, 1 ).
  3. Открывает файл назначения для записи с помощью Rewrite( DestFile, 1 ). Если возникает ошибка при этом шаге, программа будет удалить файл назначения и повторно выбросить исключение.
  4. Инициализирует переменную TotalRead в ноль, которая отслеживает общее количество байтов, прочитанных из источника файла.
  5. Получает размер файла источника с помощью FileSize( SrcFile ).
  6. Пока не все байты были прочитаны из источника файла:
    • Читает SizeOf( Buffer ) байтов из источника файла с помощью BlockRead и хранит их в буфере (Buffer).
    • Записывает эти байты в файл назначения с помощью BlockWrite. Если возникает ошибка при этом шаге, программа выбросит исключение.
    • Обновляет прогресс-бар, установив его позицию в процентном соотношении прочитанных байтов (используя prbCopy.Position) и обновляя его (используя prbCopy.Update).
  7. Закрывает оба файла с помощью CloseFile.

Замечания

  • Программа предполагает, что источник файлы называется 'srcfile.tst', а файл назначения называется 'destfile.tst'. Вы можете изменить эти имена, как вам нужно.
  • Прогресс-бар обновляется установкой его позиции в процентном соотношении прочитанных байтов, которое рассчитывается с помощью TotalRead / Fsize * 100.
  • Если возникает ошибка при копировании файла, программа удалит файл назначения и повторно выбросит исключение.

Альтернативное решение

Вместо использования функций Delphi BlockRead и BlockWrite для копирования файлов вы можете использовать более современный подход с помощью класса Delphi TFileStream. Вот пример:

var
  SrcFile, DestFile: TFileStream;
begin
  SrcFile := TFileStream.Create('srcfile.tst', fmOpenRead);
  DestFile := TFileStream.Create('destfile.tst', fmCreate);

  try
    while not SrcFile.Eof do
    begin
      DestFile.CopyFrom(SrcFile, SrcFile.Size - SrcFile.Position);
      prbCopy.Position := Trunc(DestFile.Position / SrcFile.Size * 100);
      prbCopy.Update;
    end;
  finally
    FreeAndNil(SrcFile);
    FreeAndNil(DestFile);
  end;
end;

Код использует объект TFileStream для чтения из источника файла и записи в файл назначения. Он циклически повторяется, пока не будут прочитаны все байты из источника файла, обновляя прогресс-бар на каждой итерации. Метод CopyFrom используется для копирования содержимого источника файла в файл назначения.

В статье описывается способ копирования файла с помощью ProgressBar, демонстрируя процесс чтения и записи файлов с использованием Progress Bar в Delphi.


Комментарии и вопросы


:: 2008-12-10 22:06:45 :: re:Скопировать директорию с заполнением своего ProgressBara

пользователь: vitaliy.

как скопировать директорию с заполнением своего ProgressBara


:: 2008-12-14 15:08:01 :: re:Скопировать файл с заполнением своего ProgressBara

пользователь: kan.

1. С помощью FindFirst и FindNext создаешь список файлов

if FindFirst (ldir + \'\\*.htm\', faAnyFile and not faDirectory, sr)=0 then
begin
loadcontent.add(sr.Name);//loadcontent это tstringlist
while FindNext(sr)=0 do loadcontent.add(sr.Name);
end;

2. С помощью function CopyFile(FromPath, ToPath: string): integer;, описанной http://www.kansoftware.ru/?tid=1690, копируешь файлы по одному, беря их по одному их списка loadcontent
2.1. при этом цикл у тебя будет от 0 до loadcontent.count-1
2.2. при каждой итерации двигаешь индикатор ProgressBar


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Файлы ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-07-17 16:31:23/0.0080780982971191/2