Delphi World - Быстрое копирование с диска на дискету и обратно
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Быстрое копирование с диска на дискету и обратно

Фармацевтика - наука о форматировании диска C.

Вместо чтения байта за байтом, вы должны открыть файл с размером записи, равным 64K или около того, и читать блоками. Это ускорит операцию. Если вам необходимо это сделать очень быстро и без особых затрат на программирование, поищите свободнораспространяемые компоненты для копирования файлов....

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


function CopyFile(FromPath, ToPath: string): integer;
var
  F1: file;
  F2: file;
  NumRead: word;
  NumWritten: word;
  Buf: pointer;
  BufSize: longint;
  Totalbytes: longint;
  TotalRead: longint;
begin
  Result := 0;
  Assignfile(f1, FromPath);
  Assignfile(F2, ToPath);
  reset(F1, 1);
  TotalBytes := Filesize(F1);
  Rewrite(F2, 1);
  BufSize := 16384;
  GetMem(buf, BufSize);
  TotalRead := 0;
  repeat
    BlockRead(F1, Buf^, BufSize, NumRead);
    inc(TotalRead, NumRead);
    BlockWrite(F2, Buf^, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);
  if (NumWritten <> NumRead) then
  begin
    {ошибка }
    result := -1;
  end;
  Closefile(f1);
  Closefile(f2);
end;

Если у вас есть file of byte (бинарный файл), или просто File, вы должны использовать Blockread, который позволяет устанавливать размер буфера, равный 64Кб. Ниже я предоставляю вашему вниманию "быстрый" способ достижения цели. Воспользуйтесь Compress (который, я надеюсь, вы найдете в поставке Delphi, в противном случае обратитесь на сайт Microsoft), который позволит вам создавать файлы типа filename.ex_. Это означает, что для копирования информации требуется гораздо меньше усилий.

Ниже приведен некоторый код, позволяющий копировать файлы. Будет даже лучше, если файлы будут в их текущем состоянии, поскольку, если они сжатые, процедура их просто не скопирует!


function TInstallForm.UnCompress(src, dest: string; var Error: LongInt):
  Boolean;
var
  s, d: TOFStruct;
  fs, fd: Integer;
  fnSrc, fnDest: PChar;
begin
  src := src + #0;
  dest := dest + #0;
  fnSrc := @src[1]; { Хитро преобразуем строки в ASCIIZ }
  fnDest := @dest[1];

  fs := LZOpenFile(fnSrc, s, OF_READ); { Получаем дескриптор файла }
  fd := LZOpenFile(fnDest, d, OF_CREATE);

  Error := LZCopy(fs, fd); { Вот магический вызов API }
  Result := (Error > -1);

  LZClose(fs); { Убедитесь, что закрыли! }
  LZClose(fd);
end;

procedure UnCompressError(Error: LongInt);
begin
  case Error of
    LZERROR_BADINHANDLE: S := 'Неверный дескриптор
      исходного файла';
        LZERROR_BADOUTHANDLE: S := 'Неверный дескриптор
      целевого файла';
        LZERROR_BADVALUE: S := 'Входной параметр вышел за
      границы диапазона';
        LZERROR_GLOBALLOC: S := 'Недостаточно памяти
      для требуемого буфера';
        LZERROR_GLOBLOCK: S := 'Неверный дескриптор
      структуры внутренних данных';
        LZERROR_READ: S := 'Неверный формат исходного файла';
    LZERROR_UNKNOWNALG: S := 'Исходный файл был упакован
      с использованием неизвестного алгоритма сжатия';
        LZERROR_WRITE: S := 'Недостаточно места для выходного файла'
  else
    S := 'Неизвестная проблема с распаковкой'
  end;
  MessageDlg(S, mtConfirmation, [mbOK], 0);
  Close
end;


function CopyFile(SrcName, DestName: string): boolean;
{ базовый метод копирования файла; требует
полный путь & имя для исходного & целевого файла }
var
  Buf: array[1..1024 * 4] of byte;
  { этот размер может быть изменен..
  объявляя указатель, вы можете использовать GetMem
  для создания в куче большого буфера }

  TotalRead: longint;
  NumRead,
    NumWritten: word;
  TotalWritten: longint;
  FromFileSize: longint;
  FrF, ToF: file;
  FileTime: longint;
begin
  FGetTime(SrcName, FileTime);
  Assign(FrF, SrcName);
  Reset(FrF, 1);
  FromFileSize := FileSize(FrF);

  Assign(ToF, DestName);
  Rewrite(ToF, 1);
  TotalRead := 0;
  TotalWritten := 0;
  repeat
    BlockRead(FrF, Buf, SizeOf(Buf), NumRead);
    TotalRead := TotalRead + NumRead;

    BlockWrite(ToF, Buf, NumRead, NumWritten);
    TotalWritten := TotalWritten + NumWritten;
  until (NumRead = 0) or (NumWritten <> NumRead);
  Close(FrF);
  Close(ToF);
  { возвращаем true, если они равны, в противном случае возвращаем false }
  CopyFile := (TotalWritten = FromFileSize);
end;

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования