Si tiene una ruta a un archivo (por ejemplo, /home/bob/test/foo.txt) donde cada subdirectorio de la ruta puede existir o no, ¿cómo puedo crear el archivo foo.txt de forma que usa "/home/bob/test/foo.txt" como la única entrada en lugar de crear todos los directorios inexistentes en la ruta uno por uno y finalmente crear foo.txt en sí mismo?¿Cómo puedo crear una ruta con todos sus subdirectorios en una sola toma en Perl?
Respuesta
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.
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);
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";
}
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
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. :-) –
@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
- 1. ¿Cómo puedo crear una lista de archivos en el directorio actual y sus subdirectorios con una extensión dada?
- 2. Con vim, ¿cómo puedo usar autocmd para archivos en subdirectorios de una ruta específica?
- 3. Agregue el grupo "Todos" al directorio y todos sus subdirectorios
- 4. Perl apagado una toma de
- 5. Caída de varias tablas en una sola toma en mysql
- 6. ¿Cómo puedo crear una salida columnar en Perl?
- 7. ¿Cómo crear una aplicación profesional en Perl?
- 8. Crear una instancia de un objeto javascript y rellenar sus propiedades en una sola línea
- 9. ¿Cómo puedo encapsular una cadena en Perl?
- 10. Crear un archivo de una ruta, crear subdirectorios si no existe
- 11. ¿Cómo puedo crear una Wicket URL que oculte sus parámetros?
- 12. ¿Cómo puedo hacer 2 métodos comparables en una sola clase?
- 13. crear subdirectorios en Ruby
- 14. iterar recursivamente sobre todos los archivos en un directorio y sus subdirectorios en Qt
- 15. ¿Cómo puedo hacer una búsqueda masiva y reemplazar con Perl?
- 16. ¿Cómo puedo crear matrices multidimensionales en Perl?
- 17. Cómo recopilar todos los archivos en una carpeta y sus subcarpetas que coincidan con una cadena
- 18. No se puede agregar un directorio y todos sus subdirectorios a la ruta de carga en Emacs
- 19. Eliminar carpeta y todos los archivos/subdirectorios
- 20. Con Spring 3.0, ¿puedo crear una variable de ruta opcional?
- 21. ¿Cómo agrego, digamos, n entradas de x a una lista en una sola toma?
- 22. ¿Cómo puedo reemplazar todos los 'dados' con 'confesar' en una aplicación Perl?
- 23. ¿Cómo puedo hacer una lista de todos los archivos en un directorio con Perl?
- 24. Forma no recursiva de obtener todos los archivos en un directorio y sus subdirectorios en Java
- 25. ¿Cómo actualizo una entidad OData y modifico sus propiedades de navegación en una sola solicitud?
- 26. ¿Cómo puedo preasignar una cadena en Perl?
- 27. ¿Cómo encuentro todos los puntos en una ruta en Android?
- 28. ¿Cómo puedo sustituir con una expresión evaluada en Perl?
- 29. ¿Cómo puedo crear una restricción de ruta de tipo System.Guid?
- 30. ¿Cómo convierto una ruta completa a una ruta relativa usando perl?
Creo que significa 'mkpath', no' make_path'? De lo contrario, buena respuesta. – hobbs
@Hobbs: verifique los documentos para 'File :: Path'. 'mkpath' se describe como" legacy ", y la nueva interfaz usa' make_path' para esa función. – Telemachus
Ah, eso es un cambio reciente. La versión que tengo no tiene esa interfaz. :) – hobbs