2009-08-25 11 views

Respuesta

23

Puede utilizar File::Basename y File::Path

use strict; 
use File::Basename; 
use File::Path qw/make_path/; 

my $file = "/home/bob/test/foo.txt"; 
my $dir = dirname($file); 
make_path($dir); 
open my $fh, '>', $file or die "Ouch: $!\n"; # now go do stuff w/file 

que no añadió ninguna prueba para ver si el archivo ya existe, pero eso es bastante fácil añadir con Perl.

+0

Creo que significa 'mkpath', no' make_path'? De lo contrario, buena respuesta. – hobbs

+2

@Hobbs: verifique los documentos para 'File :: Path'. 'mkpath' se describe como" legacy ", y la nueva interfaz usa' make_path' para esa función. – Telemachus

+1

Ah, eso es un cambio reciente. La versión que tengo no tiene esa interfaz. :) – hobbs

3

Uso make_dir from File::Util

use File::Util; 
    my($f) = File::Util->new(); 
    $f->make_dir('/var/tmp/tempfiles/foo/bar/'); 

    # optionally specify a creation bitmask to be used in directory creations 
    $f->make_dir('/var/tmp/tempfiles/foo/bar/',0755); 
2

No creo que haya una función estándar que puede hacer todo lo que pide, directamente del nombre de archivo.

Pero mkpath(), desde el módulo File :: Path, casi puede hacerlo dado el directorio del nombre del archivo. A partir de los documentos de archivos :: Ruta:

La función "mkpath" proporciona una manera conveniente para crear directorios, incluso si su llamada núcleo "mkdir" no creará más de un nivel de directorio en un momento.

Tenga en cuenta que mkpath() no informa de errores de una buena manera: en lugar de simplemente devolver cero, por alguna razón muere.

Dado todo eso, es posible hacer algo como:

use File::Basename; 
use File::Path; 

my $fname = "/home/bob/test/foo.txt"; 

eval { 
    local $SIG{'__DIE__'}; # ignore user-defined die handlers 
    mkpath(dirname($fname)); 
}; 
my $fh; 
if ([email protected]) { 
    print STDERR "Error creating dir: [email protected]"; 
} elsif (!open($fh, ">", $fname)) { 
    print STDERR "Error creating file: $!\n"; 
} 
+1

El código subyacente tiene alrededor de dos décadas y las modas de programación han cambiado mucho desde entonces. Está utilizando la antigua interfaz File :: Path. La nueva interfaz le permite detectar todos los errores y tratarlos (o ignorarlos) según corresponda. – dland

+0

Es bueno saber que hay una interfaz más nueva. Estoy acostumbrado a tener que escribir Perl portátil que funciona para versiones antiguas y en sistemas operativos (por lo tanto, el archivo two-arg open()), por lo que normalmente no me molesto aprendiendo qué hay de nuevo en Perl. :-) –

+1

@Michael: Entiendo que es posible que necesite escribir Old Perl por los motivos que sean, pero no entiendo por qué publicaría dicho código como ejemplos para otros. Si conoce la forma de tres argumentos de 'abrir', utilícela aquí. No necesitamos más ejemplos en la red de la forma de dos argumentos; ya tenemos más que suficiente. – Telemachus

Cuestiones relacionadas