Se si dispone di un percorso per un file (ad esempio /home/bob/test/foo.txt) in cui ogni sottodirectory nel percorso può o non può esistere, come posso creare il file foo.txt in un modo che usa "/home/bob/test/foo.txt" come unico input invece di creare ogni directory inesistente nel percorso uno alla volta e infine creare foo.txt stesso?Come posso creare un percorso con tutte le sue sottodirectory in uno scatto in Perl?
risposta
È possibile utilizzare File::Basename e 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
non ho aggiunto alcun test per vedere se il file esiste già, ma questo è abbastanza facile da aggiungere 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);
Io non credo che ci sia una funzione standard che può fare tutto ciò che si chiede, direttamente dal nome del file.
Ma mkpath(), dal modulo File :: Percorso, può quasi farlo data la directory del nome file. Dalla documentazione File :: Path:
La funzione "mkpath" fornisce un modo conveniente per creare le directory, anche se la chiamata kernel "mkdir" Non creerà più di un livello di directory a un tempo.
Si noti che mkpath() non segnala errori in modo positivo: muore invece di restituire zero, per qualche motivo.
dato tutto questo, si potrebbe fare qualcosa di simile:
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";
}
Il codice sottostante ha circa vent'anni e da allora le mode di programmazione sono cambiate molto. Stai utilizzando l'interfaccia File :: Path vecchio stile. La nuova interfaccia ti consente di cogliere tutti gli errori e gestirli (o ignorarli) secondo necessità. – dland
Buono a sapersi c'è una nuova interfaccia là fuori. Sono abituato a scrivere Perl portatile che funziona per vecchie versioni e tra sistemi operativi diversi (da qui, due-arg open()), quindi di solito non mi stuzzico imparando le novità in Perl. :-) –
@ Michael: Capisco che potresti aver bisogno di scrivere il vecchio Perl per qualsiasi motivo, ma non capisco perché potresti pubblicare questo codice come esempio per gli altri. Se sei a conoscenza della forma a tre argomenti di 'open', per favore usalo qui. Non abbiamo bisogno di più esempi sulla rete della forma a due argomenti; ne abbiamo già più che abbastanza. – Telemachus
- 1. Come posso espandere uno schema finito in tutte le sue possibili corrispondenze?
- 2. Elenca tutte le sottodirectory foglia in linux
- 3. Java: come ottenere ricorsivamente tutte le sottodirectory?
- 4. Come posso inizializzare automaticamente tutte le variabili scalari in Perl?
- 5. Come posso creare un istogramma per tutte le variabili in un set di dati con uno sforzo minimo in R?
- 6. Come posso creare un elenco di file nella directory corrente e nelle sue sottodirectory con una determinata estensione?
- 7. Impossibile aggiungere una directory e tutte le relative sottodirectory a percorso di caricamento in Emacs
- 8. come scrivere un rewriteCond in .htaccess per escludere un subdir e le sue sottodirectory
- 9. Come posso convertire un percorso completo in un percorso relativo usando perl?
- 10. Come posso creare un nuovo riferimento hash vuoto in Perl?
- 11. Come posso ottenere uno script Perl per vedere le variabili in un altro script Perl?
- 12. Perl: Come posso ottenere Emacs per aggiungere virgolette al percorso completo di uno script Perl?
- 13. In Perl/Moose, come posso applicare un modificatore a un metodo in tutte le sottoclassi?
- 14. Come ottenere file in una directory, comprese tutte le sottodirectory
- 15. come elencare tutte le sottodirectory in una directory
- 16. In Perl, come posso generare tutte le possibili combinazioni di un elenco?
- 17. Come posso creare un archivio Zip in Perl?
- 18. Come posso formattare le date in Perl?
- 19. modo elegante per fare tutte le dirs in un percorso
- 20. Come posso trovare tutte le corrispondenze con un'espressione regolare in Perl?
- 21. Come posso creare un qr // in Perl 5.12 da C?
- 22. Come posso creare un file binario in Perl?
- 23. Come posso interrogare memcached con php per ottenere un elenco di tutte le sue chiavi in memoria?
- 24. come posso creare un eseguibile standalone con perl 6?
- 25. Comprende in modo ricorsivo tutte le sottodirectory del modello
- 26. Posso creare interfacce tipo Java in Perl?
- 27. Uso di npm come posso scaricare un pacchetto come zip con tutte le sue dipendenze incluse nel pacchetto
- 28. Come posso creare un elenco di tutte le coppie uniche di punti dati in R?
- 29. Come posso ordinare le date in Perl?
- 30. Tint a UIView con tutte le sue sottoview
Credo che si intende 'mkpath', non' make_path'? Altrimenti, buona risposta. – hobbs
@Hobbs: controlla i documenti per 'File :: Percorso'. 'mkpath' è descritto come" legacy "e la nuova interfaccia usa' make_path' per quella funzione. – Telemachus
Ah, questo è un cambiamento recente. La versione che ho non ha quell'interfaccia. :) – hobbs