Быстрое копирование с диска на дискету и обратно
|
Фармацевтика - наука о форматировании диска 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;
|
|