21

ファイルをまだ作成されていない宛先ディレクトリツリーにコピーするためのPerlでの最良の方法は何ですか?

何かのようなもの

copy("test.txt","tardir/dest1/dest2/text.txt");

ディレクトリtardir/dest1/dest2がまだ存在しないため、機能しません。Perlでディレクトリを作成してコピーする最良の方法は何ですか?

4

4 に答える 4

31
use File::Path;
use File::Copy;

my $path = "tardir/dest1/dest2/";
my $file = "test.txt";

if (! -d $path)
{
  my $dirs = eval { mkpath($path) };
  die "Failed to create $path: $@\n" unless $dirs;
}

copy($file,$path) or die "Failed to copy $file: $!\n";
于 2008-10-23T11:33:32.257 に答える
8
use File::Basename qw/dirname/;
use File::Copy;

sub mkdir_recursive {
    my $path = shift;
    mkdir_recursive(dirname($path)) if not -d dirname($path);
    mkdir $path or die "Could not make dir $path: $!" if not -d $path;
    return;
}

sub mkdir_and_copy {
    my ($from, $to) = @_;
    mkdir_recursive(dirname($to));
    copy($from, $to) or die "Couldn't copy: $!";
    return;
}
于 2008-10-23T11:27:39.930 に答える
5

File::Copy::Recursive ::fcopy() はコアではありませんが、File::Path::mkpath() と File::Copy::copy() ソリューションをさらに短いものに結合し、File: とは異なりパーミッションを保持します: :コピー。また、他の気の利いたユーティリティ関数も含まれています。

于 2008-10-23T21:09:15.933 に答える
1

コピーの実行については他の回答を参照してください。ただし、ディレクトリの作成についてはPath::Classを使用すると非常に便利です。

use Path::Class;

my $destination_file  = file('tardir/dest1/dest2/test.txt');
$destination_file->dir->mkpath;

# ... do the copying here
于 2008-10-24T08:15:38.757 に答える