Советы по Delphi


Копирование файлов I


У меня есть проблема с копированием файлов. Delphi не хочет компилировать команду LZCopy.

Данный способ очень медленный:

    pbBuf := PChar( LocalAlloc(LMEM_FIXED, 1) );

FileSeek(source,0,0);
FileSeek(dest,0,0);
repeat
cbRead := Fileread(source, pbBuf, 1);

FileWrite(dest, pbBuf, cbRead); until (cbRead = 0);

Решение 1

    {  Не забудьте добавить LZExpand в список используемых модулей (USES LZExpand;) }
function CopyFile(SrcF,DestF : string) : boolean;L
var
SFile, DFile : integer; Res   : longint; Msg   : string;
begin
SFile := FileOpen(SrcF,0);        { Открытие ReadOnly = 0, Write=1, Readwrite=2} DFile := FileCreate(DestF); Res := LZCopy(SFile,DFile); FileClose(SFile); FileClose(DFile); if Res < 0 then begin Msg := 'Неизвестная ошибка'; case Res of LZERROR_BADINHANDLE   : Msg := 'Неверный дескриптор исходного файла'; LZERROR_BADOUTHANDLE  : Msg := 'Неверный дескриптор файла-приемника'; LZERROR_BADVALUE      : Msg := 'Входной параметр вышел за границы диапазона'; LZERROR_GLOBALLOC     : Msg := 'Недостаточно памяти для требуемого буфера'; LZERROR_GLOBLOCK      : Msg := 'Неверный дескриптор структуры внутренних данных'; LZERROR_READ          : Msg := 'Неверный формат исходного файла'; LZERROR_UNKNOWNALG    : Msg := 'Исходный файл был сжат неизвестным алгоритмом сжатия'; LZERROR_WRITE         : Msg := 'Недостаточно места для выходного файла'; end; MessageDlg(Msg,mtERROR,[mbOK],0); result := FALSE end else result := TRUE; end;


Решение 2

Конечно это будет медленным! Ты же читаешь по одному символу за раз... Попробуй распределить 8192 байт памяти и читать каждый проход по 8192 байт. Это должно немного ускорить процесс...

Решение 3

Самый простой способ копирования файлов:

    VAR
sI,dI:Longint;
sD,sS:TFilename;

USES LZExpand;
............
sI := FileOpen(sS,fmShareDenyWrite);
dI := FileCreate(sD);
{ Копирование файла }
CopyLZFile(sI,dI);
{ Закрытие файла }
FileClose(sI);
FileClose(dI);
............

[000088]



Содержание раздела