Советы по 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 thenbeginMsg := 'Неизвестная ошибка';case Res ofLZERROR_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 := FALSEend elseresult := 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);
............


Как мне скопировать файл?

Вот три способа:

{Данный способ использует файловый поток.}
Procedure FileCopy( Const sourcefilename, targetfilename: String );
Var
S, T: TFileStream;Begin
S := TFileStream.Create( sourcefilename, fmOpenRead );tryT := TFileStream.Create( targetfilename,fmOpenWrite or fmCreate );tryT.CopyFrom(S, S.Size ) ;finallyT.Free;end;finallyS.Free;end;End;

{Данный способ для чтения/записи использует блоки памяти.}
procedure FileCopy(const FromFile, ToFile: string);
varFromF, ToF: file;NumRead, NumWritten: Word;Buf: array[1..2048] of Char;begin
AssignFile(FromF, FromFile);Reset(FromF, 1); { Размер записи = 1 }AssignFile(ToF, ToFile); { Открываем выходной файл }Rewrite(ToF, 1); { Размер записи = 1 }repeatBlockRead(FromF, Buf, SizeOf(Buf), NumRead);BlockWrite(ToF, Buf, NumRead, NumWritten);until (NumRead = 0) or (NumWritten <> NumRead);ClloseFile(FromF);CloseFile(ToF);end;

{Данный способ использует LZCopy, добавьте в список USES модуль LZExpand.}
procedure CopyFile(FromFileName, ToFileName: string);
var
FromFile, ToFile: File;begin
AssignFile(FromFile, FromFileName); { Присваиваем FromFile FromFileName }AssignFile(ToFile, ToFileName); { Присваиваем ToFile ToFileName }Reset(FromFile); { Открываем файл для чтения }tryRewrite(ToFile); { Создаем файл для записи }try{ копируем файл, если возвращена отрицательная величина }{ возбуждаем исключение }if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle) < 0thenraise EInOutError.Create('Ошибка использования LZCopy')finallyCloseFile(ToFile); { Закрываем ToFile }end;finallyCloseFile(FromFile); { Закрываем FromFile }end;end;

[000621]



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