Page 1 sur 1

Listage de dossiers

Posté : 18 juin 2008, 23:35
par Skualys
Bonsoir :D voici un petit script d'exploration de dossier, employant une fonction récursive :
   1. function list_dir($name) {
   2.   if ($dir = opendir($name)) {
   3.     while($file = readdir($dir)) {
   4. echo $file.'<br/>';
   5.       if(is_dir($file) && $file!='.' && $file!='..') {
   6. list_dir($file);
   7.       }
   8.     }
   9.     closedir($dir);
  10.   }
  11. }
  12. list_dir('.');
Ceci marche parfaitement...pour le dossier en cours (j'ai le listage du contenu du dossier courant) et pour ses sous dossiers (leur contenu est également bien listé)...mais ça s'arrête là. Le pire étant que lorsque je fais un test sur le listage obtenu à partir des sous-dossiers... Les dossiers ne sont pas interprétés comme tel (et du coup, pas explorés). Quelqu'un aurait-il une idée ? Ou serais-je ignorant d'une limitation ?

Posté : 19 juin 2008, 01:02
par Calimero
Hello,

Quand on programme une fonction récursive il y a quelquechose que l'on oublie facilement : qu'est ce qui doit changer entre l'appel original de ta fonction et l'appel récursif ?

Le problème de ton code c'est qu'il n'y a justement rien qui change. Imaginons que tu aies cette structure :

Code : Tout sélectionner

/var/www/tonsite/ /var/www/tonsite/unrepertoire/ /var/www/tonsite/unrepertoire/unfichier /var/www/tonsite/unrepertoire/unautrerepertoire /var/www/tonsite/unrepertoire/unautrerepertoire/unautrefichier
Et que tu appelles ta fonction en lui passant en paramètre initial '/var/www/tonsite/'. Que se passe t-il ?

Premier appel, ta fonction parcourt '/var/www/tonsite/' et y trouve unrepertoire, l'affiche, et s'appelle elle-même en passant 'unrepertoire' comme paramètre.

Déjà, là, ça coince : le chemin passé en paramètre en deuxième appel n'a pas du tout la même tête que celui que tu as passé au début (qui fonctionne).

Cela peut quand même marcher à une condition : que le dossier courant (celui dans lequel php s'éxécute) soit également /var/www/tonsite/. Comme ça, en essayant d'ouvrir 'unrepertoire', ça passe encore, car ta fonction voit le chemin complet suivant : /var/www/tonsite/unrepertoire. Et tout va encore bien jusque là.

C'est à l'appel suivant que ça coince : ta fonction va essayer d'ouvrir /var/www/tonsite/unautrerepertoire. Et bien sûr ça ne passe pas vu que ça n'existe pas.

Voilà le problème. Tu l'aurais compris tout seul si tu avais affiché $name.'/'.$file au lieu de seulement $file :-)

Posté : 19 juin 2008, 21:26
par Skualys
Merci ;) En fait j'avais pensé au problème, mais j'en avais un second dans le code en définitive (la condition du while, la boucle s'arrêtant sous certaines conditions non souhaitées), du coup même après la modification que tu m'as indiquée, ça ne marchait pas mieux (bien que ce changement était bel et bien nécessaire).