Программирование на Delphi - обмен опытом / Работа с файлами и папками

© Зайцев Олег 1998-2004
Лучшая портативная техника. Плееры Камеры Телефоны Компьютеры
Покупателям, пришедшим на www.porta.ru по этой ссылке - дополнительная скидка 1%
Железо | Система | WEB | Компоненты | Графика | Ссылки | Мультимедиа | Сети | Прочее | Реестр | Литература

Статистика

Работа с файлами и папками

Рекомендую:
Главная страница \ Системное программирование \ Работа с файлами и папками

  • Работа с файлами и папками

    Работа с файлами и папками

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

    Копирование методом 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;
    
    Данный метод копирования файла пришел еще из времен Pascal, его принцип очень прост - файл источник открывается на чтение, файл-приемник создается, после этого происходит считывание данных из источника в буфер с последующей записью данных буфера в файл - приемник. Размер буфера влияет на скорость копирования и должен быть не менее 4 кб

    Копирование методом потока * * Задать вопрос Наверх

    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;
    

    Удаление файла в корзину * * Задать вопрос Наверх

    uses ShellAPI;
    
    function DeleteFileWithUndo( sFileName : string ) : boolean;
    var fos : TSHFileOpStruct;
    begin
     sFileName:= sFileName+#0;
      FillChar( fos, SizeOf( fos ), 0 );
      with fos do begin
        wFunc  := FO_DELETE;
        pFrom  := PChar( sFileName );
        fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;
      end;
      Result := ( 0 = ShFileOperation( fos ) );
    end;
    


    © Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru