Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

parcours récursif de répertoire - probleme

2 réponses
Avatar
ernond_paul
Bonjour à tous,

j'ai fait un petit code en perl, mais je suis débutant, et j'avoue que
là, je ne vois pas réellement d'où viens le probleme.

Je souhaite parcourir tous les fichiers et dossiers a aprtir d'un
dossier "root"; mon code utilisae la récursivité, mais il semble
s'arrêter dès qu'il trouve un dossier.

voici mon code :

sub getListOfLocalFiles {
my ($directory, $spacer) = @_;
my $client = shift;
my $size = shift;
## la ligne ci-dessous est mon deuxième probleme...
if (!($directory =~ m/^\w:/)) {
$directory = $client->{profilesRoot};
}
if (!$spacer) {
$spacer = " ";
}
opendir (DIR, $directory) || die ("Error Opening Directory
".$directory);
my @files = readdir(DIR);
foreach my $file (@files) {
if ($file ne "." && $file ne "..") {
if (-f $directory."\\".$file) {
$size = -s $directory."\\".$file;
printf ($spacer." %s \t".$size."\n",$file);
} elsif (-d $directory."\\".$file) {
printf ($spacer."+ %s \n",$file);
getListOfLocalFiles($directory .= "\\".$file, $spacer .= "
");
}
}
}
}

Pouvez vous m'éclairir sur mon probleme ?

Merci

2 réponses

Avatar
jl_morel
Dans l'article ,
a dit...

Je souhaite parcourir tous les fichiers et dossiers a aprtir d'un
dossier "root"; mon code utilisae la récursivité, mais il semble
s'arrêter dès qu'il trouve un dossier.

voici mon code :

sub getListOfLocalFiles {
my ($directory, $spacer) = @_;
my $client = shift;
my $size = shift;
## la ligne ci-dessous est mon deuxième probleme...
if (!($directory =~ m/^w:/)) {
$directory = $client->{profilesRoot};
}
if (!$spacer) {
$spacer = " ";
}
opendir (DIR, $directory) || die ("Error Opening Directory
".$directory);
my @files = readdir(DIR);
foreach my $file (@files) {
if ($file ne "." && $file ne "..") {
if (-f $directory."".$file) {
$size = -s $directory."".$file;
printf ($spacer." %s t".$size."n",$file);
} elsif (-d $directory."".$file) {
printf ($spacer."+ %s n",$file);
getListOfLocalFiles($directory .= "".$file, $spacer .= "
");
}
}
}
}

Pouvez vous m'éclairir sur mon probleme ?



L'appel récursif est très curieux. Pourquoi
getListOfLocalFiles($directory .= "".$file, $spacer .= " "); ??
Il faut plutôt
getListOfLocalFiles($directory . "".$file, $spacer . " ");
sinon vous modifiez la variable $directory de l'appelant et au retour
les fichiers ne sont plus reconnus par les tests.

D'autre part, quand on ouvre un répertoire il est prudent de le refermer
quand on n'en a plus besoin :

opendir (DIR, $directory) || die ("Error Opening Directory".$directory);
my @files = readdir(DIR);
close DIR;

Enfin, pourquoi ne pas utiliser le module File::Find ?
C'est un module standard qui permet de parcourir un répertoire et ses sous-
répertoires. Il est itératif et non récursif, donc plus rapide et moins
gourmand en espace mémoire.

HTH

--
J-L.M.

Avatar
ernond_paul
L'appel récursif est très curieux. Pourquoi
getListOfLocalFiles($directory .= "".$file, $spacer .= " "); ??
Il faut plutôt
getListOfLocalFiles($directory . "".$file, $spacer . " ");
sinon vous modifiez la variable $directory de l'appelant et au retour
les fichiers ne sont plus reconnus par les tests.


oups, ben évidemment que ca marche mieux...



D'autre part, quand on ouvre un répertoire il est prudent de le refermer
quand on n'en a plus besoin :

opendir (DIR, $directory) || die ("Error Opening Directory".$directory);
my @files = readdir(DIR);
close DIR;


oui, ok


Enfin, pourquoi ne pas utiliser le module File::Find ?
C'est un module standard qui permet de parcourir un répertoire et ses sous-
répertoires. Il est itératif et non récursif, donc plus rapide et moins
gourmand en espace mémoire.


peut etre parce que je souhaite réinventer la roue.... non je suis
débutant je connaissait pas File::Find mais je vais m'y pencher.

Merci beaucoup.