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

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

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

Сообщение CoverStory » 09.02.2006 18:25:43

Всем доброго!
Люди помогите пожалуйста как скопировать в Лазаре файл с одного места в другое заранее спасибо!
Давно не пользовался Паскалем а тут позарез надо!!!
CoverStory
новенький
 
Сообщения: 95
Зарегистрирован: 09.02.2006 18:21:42
Откуда: Семипалатинск

Сообщение STAKANOV » 09.02.2006 18:38:02

Приблизительно так:
Код: Выделить всё
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;
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Janus » 09.02.2006 18:57:19

В Винде можно CopyFile.
Janus
постоялец
 
Сообщения: 134
Зарегистрирован: 07.11.2005 17:06:49

Сообщение CoverStory » 10.02.2006 07:06:08

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

Сообщение CoverStory » 10.02.2006 07:22:04

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

Сообщение Nikolay » 10.02.2006 09:18:45

Код: Выделить всё
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;

Nikolay
 

Сообщение CoverStory » 10.02.2006 09:19:02

Еще такой момент как вывести сообщение что процесс копирования завершен?
CoverStory
новенький
 
Сообщения: 95
Зарегистрирован: 09.02.2006 18:21:42
Откуда: Семипалатинск

Сообщение Джентельмен » 10.02.2006 10:03:38

есть вот такой интересный код:
Код: Выделить всё
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>
Джентельмен
постоялец
 
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск

Сообщение CoverStory » 10.02.2006 11:03:16

Nikolay, спасибо файл объемом 17 Mgb закачался быстро!!! С помощью второго примера первый я не понял как применять.
CoverStory
новенький
 
Сообщения: 95
Зарегистрирован: 09.02.2006 18:21:42
Откуда: Семипалатинск

Сообщение STAKANOV » 10.02.2006 11:07:40

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

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

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

Сообщение CoverStory » 10.02.2006 16:43:05

STAKANOV спасибо, еще раз очень помог, буду теперь постоянно обращаться к этому мануалу. Я думаю что тему можно закрыть так как вопрос уже решен.
CoverStory
новенький
 
Сообщения: 95
Зарегистрирован: 09.02.2006 18:21:42
Откуда: Семипалатинск

Сообщение STAKANOV » 10.02.2006 22:57:08

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

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

Там на странице переводы - <a href='http://freepascal.ru/wiki/' target='_blank'>http://freepascal.ru/wiki/</a> есть ссылки на английские оригиналы
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 9

Рейтинг@Mail.ru