Existe-t-il une fonction en Perl qui répertorie tous les fichiers et répertoires d'un répertoire? Je me souviens que Java a la File.list()
pour ce faire? Existe-t-il une méthode comparable en Perl?
Si vous voulez obtenir le contenu d'un répertoire donné, et seulement lui (c'est-à-dire pas de sous-répertoires), la meilleure façon est d'utiliser opendir/readdir/closedir:
opendir my $dir, "/some/path" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;
Vous pouvez aussi utiliser:
my @files = glob( $dir . '/*' );
Mais à mon avis, ce n'est pas aussi bon - principalement parce que glob est une chose assez complexe (peut filtrer les résultats automatiquement) et l'utiliser pour obtenir tous les éléments du répertoire semble être une tâche trop simple.
D'un autre côté, si vous avez besoin d'obtenir du contenu de tous les répertoires et sous-répertoires, il existe essentiellement une solution standard:
use File::Find;
my @content;
find( \&wanted, '/some/path');
do_something_with( @content );
exit;
sub wanted {
Push @content, $File::Find::name;
return;
}
readdir () fait cela.
Vérifiez http://perldoc.Perl.org/functions/readdir.html
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
closedir DIR;
cela devrait le faire.
my $dir = "bla/bla/upload";
opendir DIR,$dir;
my @dir = readdir(DIR);
close DIR;
foreach(@dir){
if (-f $dir . "/" . $_ ){
print $_," : file\n";
}elsif(-d $dir . "/" . $_){
print $_," : folder\n";
}else{
print $_," : other\n";
}
}
Ou File :: Find
use File::Find;
finddepth(\&wanted, '/some/path/to/dir');
sub wanted { print };
Il passera par des sous-répertoires s'ils existent.
Si vous êtes un fainéant comme moi, vous aimerez peut-être utiliser le module File :: Slurp . La fonction read_dir lit le contenu du répertoire dans un tableau, supprime les points et, si nécessaire, préfixe les fichiers renvoyés avec le dir pour les chemins absolus
my @paths = read_dir( '/path/to/dir', prefix => 1 ) ;
Cela répertoriera tout (y compris les sous-répertoires) du répertoire que vous spécifiez, dans l'ordre et avec les attributs. J'ai passé des jours à chercher quelque chose pour le faire, et j'ai pris part à toute cette discussion, et un peu à moi, et je l'ai monté. PRENDRE PLAISIR!!
#!/usr/bin/Perl --
print qq~Content-type: text/html\n\n~;
print qq~<font face="arial" size="2">~;
use File::Find;
# find( \&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line
find( \&wanted_tom, '/home');
exit;
sub wanted_tom {
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_);
$mode = (stat($_))[2];
$mode = substr(sprintf("%03lo", $mode), -3);
if (-d $File::Find::name) {
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>";
} else {
print "$File::Find::name --ATTR:$mode<br>";
}
return;
}