2009-08-25 11 views

risposta

23

È 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.

+0

Credo che si intende 'mkpath', non' make_path'? Altrimenti, buona risposta. – hobbs

+2

@Hobbs: controlla i documenti per 'File :: Percorso'. 'mkpath' è descritto come" legacy "e la nuova interfaccia usa' make_path' per quella funzione. – Telemachus

+1

Ah, questo è un cambiamento recente. La versione che ho non ha quell'interfaccia. :) – hobbs

3

Usa 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

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"; 
} 
+1

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

+0

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. :-) –

+1

@ 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

Problemi correlati