2016-06-24 11 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"は問題なくディレクトリとして作成されます。どうしたの?あなただけの2つのミス作ら

+1

ライセンスに応じて、プロジェクトにコードを含めることもできますし、ダウンロードしてプロジェクトのサブフォルダ( 'lib /'フォルダなど)に手動でインストールすることもできます。 – oldtechaa

+0

これはおそらく私がやろうとしていることですが、私のコードがディレクトリをファイルとして検出する理由についてはまだ混乱しています。 – QuillAndSaber

答えて

1

:このテスト(-d $filename && $filename ne "." && $filename ne "..")が失敗した場合

  • を、それが$filenameがそれだディレクトリのどちらかではないことを意味し、「」または ".."。あなたはその最後の可能性を忘れてしまった。これを修正する方法は、-d $filenameのテストの後に$filename ne "." && $filename ne ".."とすることです(コードを参照)。
  • $filenameだけでなく、"$sourcedir/$filename"がdirであるかどうかを確認する必要があります。

この二つの問題修正とそう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として、あなたはあなたのプロジェクト内のファイルのコード::コピー::再帰を含めることができます。

関連する問題