Быстрое копирование с диска на дискету и обратно

Советы » Файлы » Быстрое копирование с диска на дискету и обратно

Вместо чтения байта за байтом, вы должны открыть файл с размером записи, равным 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

;

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com