parcours récursif de répertoire - probleme

Le
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."",$file);
} elsif (-d $directory."\".$file) {
printf ($spacer."+ %s ",$file);
getListOfLocalFiles($directory .= "\".$file, $spacer .= "
");
}
}
}
}

Pouvez vous m'éclairir sur mon probleme ?

Merci
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jl_morel
Le #434328
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.

ernond_paul
Le #434286
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.

Publicité
Poster une réponse
Anonyme