Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Файловая система , Файлы

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

F8 - Copy? Да кто ж тебе это сказал?!

Копирование методом TurboPascal


type
  {Для индикации процесса копирования}
  TCallBack = procedure (Position, Size: Longint);

procedure FastFileCopy(const InfileName, OutFileName: string;
          CallBack: TCallBack);
const
  BufSize = 3*4*4096; { 48Kbytes дает прекрасный результат }
type
  PBuffer = ^TBuffer;
  TBuffer = array [1..BufSize] of Byte;
var
  Size : integer;
  Buffer : PBuffer;
  infile, outfile : file;
  SizeDone, SizeFile: Longint;
begin
  if (InFileName <> OutFileName) then
  begin
    buffer := nil;
    AssignFile(infile, InFileName);
    System.Reset(infile, 1);
    try
      SizeFile := FileSize(infile);
      AssignFile(outfile, OutFileName);
      System.Rewrite(outfile, 1);
      try
        SizeDone := 0; New(Buffer);
        repeat
          BlockRead(infile, Buffer^, BufSize, Size);
          Inc(SizeDone, Size);
          CallBack(SizeDone, SizeFile);
          BlockWrite(outfile,Buffer^, Size)
        until
          Size < BufSize;
        FileSetDate(TFileRec(outfile).Handle,
        FileGetDate(TFileRec(infile).Handle));
      finally
        if Buffer <> nil then
          Dispose(Buffer);
        System.close(outfile)
      end;
    finally
      System.close(infile);
    end;
  end
  else
    raise EInOutError.Create('File cannot be copied into itself');
end;

Копирование методом потока


procedure FileCopy(const SourceFileName, TargetFileName: string);
var
  S, T : TFileStream;
begin
  S := TFileStream.Create(sourcefilename, fmOpenRead );
  try
    T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate);
    try
      T.CopyFrom(S, S.Size ) ;
      FileSetDate(T.Handle, FileGetDate(S.Handle));
    finally
      T.Free;
    end;
  finally
    S.Free;
  end;
end;

Копирование методом LZExpand


uses
  LZExpand;

procedure CopyFile(FromFileName, ToFileName : string);
var
  FromFile, ToFile: file;
begin
  AssignFile(FromFile, FromFileName);
  AssignFile(ToFile, ToFileName);
  Reset(FromFile);
  try
    Rewrite(ToFile);
    try
      if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle)<0 then
        raise Exception.Create('Error using LZCopy')
    finally
      CloseFile(ToFile);
    end;
  finally
    CloseFile(FromFile);
  end;
end;

Копирование методами Windows


uses
  // !!! важно
  ShellApi;

function WindowsCopyFile(FromFile, ToDir : string) : boolean;
var
  F: TShFileOpStruct;
begin
  F.Wnd := 0; F.wFunc := FO_COPY;
  FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);
  ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  result:=ShFileOperation(F) = 0;
end;

// пример копирования
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not WindowsCopyFile('C:\UTIL\ARJ.EXE', GetCurrentDir) then
    ShowMessage('Copy Failed');
end;

Рады файловой копии!

Вы предоставили четыре различных метода для копирования файлов на языке Pascal:

  1. FastFileCopy TurboPascal: это классика, написанная в стиле Turbo Pascal. Она использует буфер для чтения и записи файла в блоки, с возможным callback-процедурой для отслеживания прогресса.
  2. TFileStream Delphi: этот метод использует встроенный компонент TFileStream Delphi для копирования файлов. Он прост и легко использовать.
  3. LZExpand'CopyFile: этот метод использует библиотеку LZExpand для сжатия файла при копировании. Это хорошая альтернатива для больших файлов или когда вам нужно сохранить место на диске.
  4. Windows' ShFileOperation: этот метод использует функцию Windows API ShFileOperation для копирования файлов с помощью встроенной функциональности оболочки. Он удобен для копирования файлов с ошибкой и возможностью отмены.

Вот некоторые наблюдения и предложения:

  • В процедуре FastFileCopy вы можете добавить обработку ошибок для случаев, когда файл не может быть открыт или записан.
  • Размер буфера в FastFileCopy установлен в 48 КБ. Вы можете экспериментировать с различными размерами, чтобы найти оптимальный баланс между скоростью и использованием памяти.
  • В методе TFileStream вы можете использовать блок try-except для ловли исключений, которые возникают при копировании файлов.
  • Для метода LZExpand вы можете добавить обработку ошибок для случаев, когда сжатие не удается или файлы не совместимы с библиотекой.
  • Метод Windows API удобен, но он требует больше зависимостей и может быть платформ-зависимым. Вы можете рассмотреть использование кросс-платформенного решения.

В целом, каждый метод имеет свои преимущества и недостатки. Выбор правильного метода зависит от вашей конкретной задачи, таких как производительность, сжатие, обработка ошибок и совместимость.

Копирование файлов в программном коде на языке Паскаль: сравнительный анализ методов копирования файлов с использованием TurboPascal, потоковой передачи, LZExpand и Windows API.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:56:07/0.0037238597869873/0