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

Модератор: Модераторы

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

Сообщение Andreich » 28.02.2009 14:13:15

Вопрос : Люди, помогите пожалуйста, как скопировать в Лазаре файл из одного места в другое?!

Ответ : 1
Среда : Lazarus, FreePascal
Операционная система : любая
Зависимости : -
Источник : http://freepascal.ru/forum/viewtopic.php?f=5&t=613
Теги : копирование, файлы

* медленный способ
Код: Выделить всё
var
src,dst:file of byte;
b:byte;
begin
AssignFile(src,'srcfile'); // источник
AssignFile(dst,'dstfile'); // приемник
reset(src);
rewrite(dst);
while not(eof(src)) do
begin
  read(src,b);
  write(dst,b);
end;
CloseFile(src);
CloseFile(dst);
end;

Это самый медленный способ. Копировать надо не по-байтно, а использовать буфер, можно даже сначала весь файл в память считать, а потом записать.

Ответ : 2
Среда : Lazarus, FreePascal
Операционная система : любая
Зависимости : -
Источник : http://freepascal.ru/forum/viewtopic.php?f=5&t=613
Теги : копирование, файлы

Код: Выделить всё
var Source, Dest: TStream;
begin
Source:=TFileStream.Create...
Dest:=TFileStream.Create...
Dest.CopyFrom(Source, Source.Size);
...
end;

// если маленький файл:

var F: TMemoryStream;
begin
F:=TMemoryStream.Create;
F.LoadFromFile(SourceFileName);
F.SaveToFile(DestFileName);
end;
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Как скопировать файл из одного места в другое?

Сообщение and » 15.10.2009 21:27:53

Ответ : 3
Зависимости : модуль FileUtils

Можно воспользоваться стандартной функцией копирования:
Код: Выделить всё
uses ..., FileUtils;

// 1st_variant
function CopyFile(const SrcFilename: String;const DestFilename: String):Boolean;

// 2nd_variant
function CopyFile(const SrcFilename: String;const DestFilename: String;PreserveTime: Boolean):Boolean;

Аватара пользователя
and
постоялец
 
Сообщения: 124
Зарегистрирован: 16.09.2009 17:11:01
Откуда: г. Гомель, Беларусь

Re: Как скопировать файл из одного места в другое?

Сообщение prays » 08.06.2010 12:09:11

Вот еще более быстрый метод
отличается от вышеуказанного тем что не нужно ставить размер
copyfrom(_src, _src.size) если его не указывать а такое желательно делать не
если эта функция будет выполнять копирование сразу большого колличества файлов
не будет захломлять процессор подсчетом размера файла

Код: Выделить всё
function CopyFile(src,dst:string):boolean;
var
     _src:TSream;  // Потоки
     _dst:TStream; // и тоже потоки
begin
     try
         _src:=TFileStream.create(src); // создаем файловый поток по указанному имени исходного файла
         _dst:=TFileStream.create(dst); // создаем файловый поток по указанному имени конечного файла
         _dst.copyfrom(_src); // копируем поток
         _src.free; // очищаем все за собой
         _dst.free; // и это тоже....
         Copyfile:=true;
      // Если что то пошло не так то возвращаем неудачу!!!
       except
                  Copyfile:=false;
      end;
end;
prays
незнакомец
 
Сообщения: 3
Зарегистрирован: 07.06.2010 20:56:23

Re: Как скопировать файл из одного места в другое?

Сообщение PapaNT » 09.06.2010 18:08:46

Я тут недавно родил ниже следующий код для копирования файлов. Только учтите, что у меня там использовалась собственная функция проверки наличия файла + если конечный файл уже есть, то его сразу обрезает до нулевого размера (мне так было надо).
n возвращает: 0 - нет ошибок, 1 - проблемы с копируемым файлом, 2 - проблемы с конечным файлом.
Результат работы функции - IOResult.
Буфер можно регулировать под себя (для оптимизации производительности).

Код: Выделить всё
Function FileCopy(SFileName,DFileName : Shortstring;Var n : byte) : Integer;
Const
  BufSize = 65536;

Type
  TBuf = array [1..65536] of byte;
  PTBuf = ^TBuf;
Var
  i,ii : Longint;
  buf  : PTBuf;
  SFile ,
  DFile : File of Byte;
  FSize : Longint;
  IOR   : integer;
  FTime : Longint;
begin
  FileCopy := 0;
  N := 0;
  Assign(SFile,SFileName);
  {$i-}
  reset(SFile,1);
  {$i+}
  IOR := IOResult;
  if IOR <> 0 Then
    begin
      FileCopy := IOR;
      N := 1;
      exit
    end;
  assign(DFile,DFileName);
  if Not Exist_File(DFileName) then
    begin
      {$i-}
      rewrite(DFile,1)
      {$i+}
    end
                           else
    begin
      {$i-}
      reset(DFile,1);
      truncate(DFile)
      {$i+}
    end;
  IOR := IOResult;
  if IOR <> 0 Then
    begin
      FileCopy := IOR;
      N := 2;
      exit
    end;
  New(Buf);
  for i := 1 to FileSize(SFile) div BufSize do
    Begin
      BlockRead(SFile,Buf^,BufSize);
      BlockWrite(DFile,Buf^,BufSize)
    end;
  ii := FileSize(SFile) mod BufSize;
  if ii <> 0 Then
    Begin
      BlockRead(SFile,Buf^,ii);
      BlockWrite(DFile,Buf^,ii)
    end;
  Dispose(Buf);
  GetFTime(SFile,FTime);
  SetFTime(DFile,FTime);
  Close(SFile);
  Close(DFile);
end;
PapaNT
постоялец
 
Сообщения: 162
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва


Вернуться в Файловая система

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru