2008-10-23 8 views

Respuesta

27
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: [email protected]\n" unless $dirs; 
} 

copy($file,$path) or die "Failed to copy $file: $!\n"; 
+1

File :: Path :: mkpath arroja una excepción por error por lo que su "o morir" no es correcto. – ysth

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; 
} 
+0

Según archivo corelist :: Path ha formado parte del núcleo desde 5.001. –

+0

Interesante. No está en 5.10, pero está presente en versiones anteriores. –

+0

Corelist es un poco problemático sobre la notación para los números de versión. Ejecute "corelist -a File :: Path" y verá que v2.04 fue lanzado con Perl "5.01" (en lugar de 5.010). –

5

File::Copy::Recursive :: FCOPY() no se considera básica, pero combina el archivo :: :: Ruta mkpath() y File :: :: Copia de copia() solución en algo aún más cortos, y conservas permisos a diferencia de File :: Copy. También contiene otras funciones de utilidad ingeniosas.

+0

Este abordaje resultó ser la opción más fácil disponible. Opté por usar la función dircopy de File :: Copy :: Recursive. Las 2 principales ventajas son que las funciones de File :: Copy :: Recursive crearán automáticamente cualquier directorio. estructura y también conservará los permisos cuando hace copias. – slm

1

ver las otras respuestas para hacer la copia, pero para crear el directorio Path::Class es muy agradable de usar:

use Path::Class; 

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

# ... do the copying here 
Cuestiones relacionadas