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

Проблема

Необходимо скопировать файл, однако в Perl не существует встроенной команды копирования.

Решение

Воспользуйтесь функцией сору стандартного модуля File::Copy:
use File::Copy;
copy($oldfile, $newfile);
То же самое делается и вручную:
open(IN,  "< $oldfile") or die "can't open $oldfile: $!";
open(OUT, "> $newfile") or die "can't open $newfile: $!";
$blksize = (stat IN)[11] || 16384; # Желательный размер блока?
while ($len = sysread IN, $buf, $blksize) {
  if (!defined $len) {
    next if $! =~ /^Interrupted/;
    die "System read error: $!\n";
  }
  $offset = 0;
  while ($len) {             # Частичные операции записи
    defined($written = syswrite OUT, $buf, $len, $offset)
    or die "System write error; $!\n";
    $len -= $written;
    $offset += $written;
  }
}
close(IN);
close(OUT);
Также можно воспользоваться программой сору вашей системы:
system("cp $oldfile $newfile");     # unix
system("copy $oldfile $newfile");   # dos, vms

Комментарий

Модуль File::Copy содержит функции copy и move. Они удобнее низкоуровневых функций ввода/вывода и обладают большей переносимостью по сравнению с вызовом system. Функция move допускает перемещение между каталогами, а стандартная функция Perl rename — нет (обычно).
use File::Copy;
сору("datafile.dat", "datafile.bak")
or die "copy failed: $!";
move("datafile.new", "datafile.dat")
or die "move failed: $!";
Поскольку обе функции возвращают лишь простой признак успешного завершения, вы не сможете легко определить, какой файл помешал успешному копированию или перемещению. При ручном копировании файлов можно узнать, какие файлы не были скопированы, но в этом случае ваша программа забивается сложными вызовами sysread и syswrite.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: