Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
Вместо чтения байта за байтом, вы должны открыть файл с размером записи, равным 64K или около того, и читать блоками. Это ускорит операцию. Если вам необходимо это сделать очень быстро и без особых затрат на программирование, поищите свободнораспространяемые компоненты для копирования файлов....
Пример процедуры копирования файла copyfile:
functionCopyFile(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_. Это означает, что для копирования информации требуется гораздо меньше усилий.
Ниже приведен некоторый код, позволяющий копировать файлы. Будет даже лучше, если файлы будут в их текущем состоянии, поскольку, если они сжатые, процедура их просто не скопирует!
functionTInstallForm.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
;
functionCopyFile(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;