2016-06-24 81 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"; 

「測試1」是包含一個文件和目錄,其中包含一個文件(都具有唯一的名稱)的目錄。 「test2」是一個空的但現存的目錄。

當我運行這個時,我得到一個錯誤「'test1/..'和'test2/..'在rec_cpy.pl第26行相同(不復制)」,這是有道理的(因爲它們都已經存在並已在其中有「..」)。但是,當我打開test2時,test1中的目錄複製爲一個目錄,而不是作爲文件,但「itried」被創建爲一個沒有問題的目錄。這是怎麼回事?

+1

根據許可證,您可以將代碼包含在您的項目中,或者您可以下載它並手動安裝到項目的子文件夾中(例如'lib /'文件夾)。 – oldtechaa

+0

這可能是我最終要做的事情,但我仍然對爲什麼我的代碼將該目錄檢測爲文件感到困惑。 – QuillAndSaber

回答

1

您剛纔提出2個錯誤:

  • 如果測試失敗(-d $filename && $filename ne "." && $filename ne ".."),這意味着$filename或者是不是一個目錄它的「」要麼 」..」。你忘了最後的可能性。糾正這種情況的一種方法是在測試-d $filename(參見下面的代碼)後放$filename ne "." && $filename ne ".."
  • 您需要檢查"$sourcedir/$filename"是否是一個目錄,而不僅僅是$filename

所以用這個兩個問題的foreach循環更正:

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 mentionned,您可以包括文件的代碼:: ::複製項目中的遞歸。

相關問題