Qual é a melhor maneira em Perl para copiar arquivos em uma árvore de diretórios ainda-a-ser-criado?
Pergunta
O que é a melhor maneira de Perl para copiar arquivos para uma árvore de diretório de destino ainda-a-ser-criado?
Algo como
copy("test.txt","tardir/dest1/dest2/text.txt");
não trabalho desde o diretório tardir / dest1 / dest2 ainda não existe. Qual é a melhor maneira de copiar com a criação de diretório em Perl?
Solução
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";
Outras dicas
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;
}
File :: cópia :: recursiva :: fcopy ( ) é non-core, mas combina o File :: Path :: mkpath () e :: solução de cópia de arquivo :: copy () em algo ainda mais curto, e preserva as permissões ao contrário File :: copy. Ele também contém outras funções utilitárias bacana.
Veja as outras respostas para fazer a cópia, mas para criar o diretório Path :: Class é muito agradável de usar:
use Path::Class;
my $destination_file = file('tardir/dest1/dest2/test.txt');
$destination_file->dir->mkpath;
# ... do the copying here
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow