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

Вопросы программирования и использования среды Lazarus.

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

Ответить
CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

Всем доброго!
Люди помогите пожалуйста как скопировать в Лазаре файл с одного места в другое заранее спасибо!
Давно не пользовался Паскалем а тут позарез надо!!!
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Приблизительно так:

Код: Выделить всё

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;
Janus
постоялец
Сообщения: 134
Зарегистрирован: 07.11.2005 16:06:49

Сообщение Janus »

В Винде можно CopyFile.
CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

Я пробовал copyfile но вроде бы такого метода не нашел!
CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

STAKANOV спасибо работает, только медленно!!!
Nikolay

Сообщение Nikolay »

Код: Выделить всё

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;

CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

Еще такой момент как вывести сообщение что процесс копирования завершен?
Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Сообщение Джентельмен »

есть вот такой интересный код:

Код: Выделить всё

Uses
  OldLinux;
function copyfile(name1, name2: string):integer;
const
  BUFSIZE=512;
  PERM=0644;
var
  infile, outfile: integer;
  nread: longint;
  buffer: array [0..BUFSIZE-1] of byte;
begin

  infile := fdopen (name1, Open_RDONLY);
  if infile=-1 then
  begin
    copyfile:=-1;
    exit;
  end;

  outfile := fdopen (name2, Open_WRONLY or Open_CREAT or Open_TRUNC, octal(PERM));
  if outfile=-1 then
  begin
    fdclose(infile);
    copyfile:=-2;
    exit;
  end;

  nread := fdread (infile, buffer, BUFSIZE);
  while nread > 0 do
  begin

    if fdwrite (outfile, buffer, nread) < nread then
    begin
      fdclose (infile);
      fdclose (outfile);
      copyfile:=-3;
      exit;
    end;
    nread := fdread (infile, buffer, BUFSIZE);
  end;

  fdclose (infile);
  fdclose (outfile);

  if (nread = -1) then
    copyfile := -4
  else
    copyfile := 0;
end;    


я им пользуюс в линуксе...
пробывал собрать его в винде...
там надо подключать библиотеку Linux или OldLinux а в винде её нет...
может кто-то подскажет как заставить эту функцию работать в винде?
и есть еще книга хорошая...
всем рекомендую: <a href='http://freepascal.ru/download/book/sysfpc.zip' target='_blank'>http://freepascal.ru/download/book/sysfpc.zip</a>


<span style='color:red'><span style='font-size:8pt;line-height:100%'>рекоменуется оформлять исходные тексты наглядно, это не очень сложно ;)
см. <a href='http://freepascal.ru/rules/forum/' target='_blank'>правила форума</a> п.3 раздела Рекомендации</span></span>
CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

Nikolay, спасибо файл объемом 17 Mgb закачался быстро!!! С помощью второго примера первый я не понял как применять.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

STAKANOV спасибо работает, только медленно!!!

да, это самый медленный способ :rolleyes:
копировать надо не по-байтно, а использовать буфер, можна даже сначала весь файл в память считать, а потом записать

см. в сторону - <a href='http://freepascal.ru/wiki/index.php/BlockRead' target='_blank'>BlockRead</a> и <a href='http://freepascal.ru/wiki/index.php/BlockWrite' target='_blank'>BlockWrite</a>

о! в описании <a href='http://freepascal.ru/wiki/index.php/BlockRead' target='_blank'>BlockRead</a> как раз классический пример :D

я им пользуюс в линуксе... пробывал собрать его в винде...

обрати внимание, алгоритм почти такой же как я показал (вообщето это во многих учебниках встречается), только я использую фукнции которые не зависят от ОС
CoverStory
новенький
Сообщения: 95
Зарегистрирован: 09.02.2006 17:21:42
Откуда: Семипалатинск

Сообщение CoverStory »

STAKANOV спасибо, еще раз очень помог, буду теперь постоянно обращаться к этому мануалу. Я думаю что тему можно закрыть так как вопрос уже решен.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

STAKANOV спасибо, еще раз очень помог, буду теперь постоянно обращаться к этому мануалу.

мануал правда не доделан :( точнее недопереведен, к сожалению у нас мало активистов поддерживающих opensource и тп :( поэто работа по перводу идет очень медленно :(

Там на странице переводы - <a href='http://freepascal.ru/wiki/' target='_blank'>http://freepascal.ru/wiki/</a> есть ссылки на английские оригиналы
Ответить