Je dois parcourir des répertoires de facon récursive afin de construire un
arbre. Le problème est que je n'ai pas besoin de parcourir systématiquement
tous les sous-répertoires (et il y en a beaucoup). Sur base du nom je peux
en éliminer certains: Par exemple à chaque fois qu'il y a un répertoire
"BACKUP" on sait qu'il est inutile d'aller voir ce qu'il y a en-dessous.
Pour le moment j'utilise un find(&listFolders, $entrypoint)
Et dans la subroutine listFolders je fais un $File::Find::name if -d &&
!/^.$/; ca fonctionne mais c'est horriblement lent et comme c'est appelé
depuis un CGI ce n'est pas possible de laisser le utilisateurs attendre
plusieurs minutes à chaque fois.
J'ai essayé d'ajouter un "next if /\/BACKUP$/;" mais ca n'a pas l'air de
fonctionner.
Si quelqu'un peut m'aider ca serait sympa parce que je débute en perl et je
ne suis pas encore très à l'aise avec ce language.
À (at) Fri, 20 Aug 2004 15:44:01 +0000 (UTC), Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Ça ne marchera pas. Si le stat dit que c'est un répertoire, alors ce ne sera pas un lien (info qu'on peut avoir avec un lstat()) Comme ça, ça devrait être mieux :
if (not -l "$dir/$name" and -d _) { ... }
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma réponse que j'ai remplacé le dernier nom par _.
Petit extrait de perlfunc :
Si le descripteur spécial, constitué d'un seul underscore (N.d.T. : caractère souligné), est fourni comme argument d'un test de fichier (ou aux opérateurs stat() et lstat()), alors c'est la structure stat du dernier fichier traité par un test (ou opérateur) qui est utilisée, épargnant ainsi un appel système. (Ceci ne fonctionne pas avec -t et n'oubliez pas que lstat() et -l laisseront dans la structure stat des informations liées au fichier symbolique et non au fichier réel.)
C'est cette dernière remarque que j'avais oublié.
Merci pour cette (deuxième!) correction.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Fri, 20 Aug 2004 15:44:01 +0000 (UTC),
Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Ça ne marchera pas. Si le stat dit que c'est un répertoire,
alors ce ne sera pas un lien (info qu'on peut avoir avec un lstat())
Comme ça, ça devrait être mieux :
if (not -l "$dir/$name" and -d _) { ... }
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En
fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma
réponse que j'ai remplacé le dernier nom par _.
Petit extrait de perlfunc :
Si le descripteur spécial, constitué d'un seul underscore (N.d.T. :
caractère souligné), est fourni comme argument d'un test de fichier (ou
aux opérateurs stat() et lstat()), alors c'est la structure stat du
dernier fichier traité par un test (ou opérateur) qui est utilisée,
épargnant ainsi un appel système. (Ceci ne fonctionne pas avec -t et
n'oubliez pas que lstat() et -l laisseront dans la structure stat des
informations liées au fichier symbolique et non au fichier réel.)
C'est cette dernière remarque que j'avais oublié.
Merci pour cette (deuxième!) correction.
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Fri, 20 Aug 2004 15:44:01 +0000 (UTC), Laurent Wacrenier <lwa@ teaser . fr> écrivait (wrote):
Ça ne marchera pas. Si le stat dit que c'est un répertoire, alors ce ne sera pas un lien (info qu'on peut avoir avec un lstat()) Comme ça, ça devrait être mieux :
if (not -l "$dir/$name" and -d _) { ... }
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma réponse que j'ai remplacé le dernier nom par _.
Petit extrait de perlfunc :
Si le descripteur spécial, constitué d'un seul underscore (N.d.T. : caractère souligné), est fourni comme argument d'un test de fichier (ou aux opérateurs stat() et lstat()), alors c'est la structure stat du dernier fichier traité par un test (ou opérateur) qui est utilisée, épargnant ainsi un appel système. (Ceci ne fonctionne pas avec -t et n'oubliez pas que lstat() et -l laisseront dans la structure stat des informations liées au fichier symbolique et non au fichier réel.)
C'est cette dernière remarque que j'avais oublié.
Merci pour cette (deuxième!) correction.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
Laurent Wacrenier
Paul Gaborit écrit:
if (not -l "$dir/$name" and -d _) { ... }
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma réponse que j'ai remplacé le dernier nom par _.
Avec le cache, on doit pouvoir aussi écrire if (lstat "$dir/$name" and -d _)
Paul Gaborit <Paul.Gaborit@invalid.invalid> écrit:
if (not -l "$dir/$name" and -d _) { ... }
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En
fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma
réponse que j'ai remplacé le dernier nom par _.
Avec le cache, on doit pouvoir aussi écrire
if (lstat "$dir/$name" and -d _)
Tout à fait exact (perl crie "The stat preceding -l _ wasn't an lstat"). En fait, j'avais testé en mettant deux fois le nom et c'est en rédigeant ma réponse que j'ai remplacé le dernier nom par _.
Avec le cache, on doit pouvoir aussi écrire if (lstat "$dir/$name" and -d _)