2016-06-24 3 views
1

Для начала я знаю, что есть библиотека File :: Copy :: Recursive, которая имеет эквивалентную функцию. К сожалению, я сейчас работаю на сервере, где у меня нет свободы для установки библиотек, и убедить человека, который может это не практично.Скопировать каталог и все его содержимое?

Я пытаюсь написать функцию, которая скопирует все содержимое каталога, включая подкаталоги и их содержимое, в новый пустой каталог. Вот мой полный код Сейчас:

#!/usr/bin/perl 

use File::Copy; 

# To use: rec_cpy (sourcedir, destdir) 
sub rec_cpy { 
    my $sourcedir = $_[0]; 
    my $destdir = $_[1]; 
    # open the directory 
    opendir(DIR, $sourcedir) or die "Failed to open $sourcedir\n"; 
    my @files = readdir(DIR); 
    closedir(DIR); 
    # iterate over contents of directory 
    foreach my $filename (@files) { 
    if(-d $filename && $filename ne "." && $filename ne "..") { 
    # if a subdirectory, make the directory and copy its contents 
    mkdir "$destdir/$filename"; 
    rec_cpy("$sourcedir/$filename","$destdir/$filename"); 
    } 
    else { 
     # if anything else, copy it over 
     copy ("$sourcedir/$filename","$destdir/$filename"); 
    } 
    } 
    return; 
} 

rec_cpy("test1", "test2"); 
mkdir "itried"; 

«test1» является каталогом, который содержит файл и каталог, который содержит файл (все они имеют уникальные имена). «test2» - это пустой, но существующий каталог.

Когда я запускаю это, я получаю сообщение об ошибке «test1/..» и «test2/..» идентичны (не скопированы) в rec_cpy.pl строке 26 », что имеет смысл (поскольку оба они уже существуют и уже имеют «..» в них). Однако, когда я открываю test2, каталог из test1 копируется как каталог, а не как файл, но «itried» создается как каталог без проблем. Что происходит?

+1

В зависимости от лицензирования вы можете просто включить код в свой проект или загрузить его и вручную установить в подпапку вашего проекта (например, в папку 'lib /'). – oldtechaa

+0

Это, вероятно, то, что я собираюсь закончить, но я все еще смущен, почему мой код определяет каталог как файл. – QuillAndSaber

ответ

1

Вы только что сделали 2 ошибки:

  • Если этот тест (-d $filename && $filename ne "." && $filename ne "..") выходит из строя, это означает $filename либо не является каталогом или это «» или "..". Вы забыли о последних возможностях. Способ исправить это - поставить $filename ne "." && $filename ne ".." после тестирования -d $filename (см. Приведенный ниже код).
  • Вам необходимо проверить, нет ли "$sourcedir/$filename", а не только $filename.

Так цикл Еогеасп с этими двумя проблемами исправлены:

foreach my $filename (@files) { 
    if(-d "$sourcedir/$filename") { 
     if ($filename ne "." && $filename ne "..") { 
      # if a subdirectory, make the directory and copy its contents 
      mkdir "$destdir/$filename"; exit; 
      rec_cpy("$sourcedir/$filename","$destdir/$filename"); 
     } 
    } 
    else { 
     # if anything else, copy it over 
     copy ("$sourcedir/$filename","$destdir/$filename"); 
    } 
} 


Но, как @oldtechaa упоминалось, вы можете включить код File :: Copy :: Рекурсивный в проекте.

Смежные вопросы