Page 1 sur 1

Arborescence et fonction récursive

Posté : 25 avr. 2005, 23:16
par Chidi
Hello,

Je souhaite afficher l'arborescence d'un répertoire qui contient plusieurs niveaux sous-répertoires. Pour ce, j'utilise une fonction récursive comme suit :

function list_dir($path) {
if ($dir = opendir($path)) {
while($file = readdir($dir)) {
echo "$file\n";
if(is_dir($file) && !in_array($file, array(".", ".."))) {
list_dir($file);
}
}
closedir($dir);
}
}

Le problème que je rencontre est que la fonction ne m'affiche pas tous les sous-niveaux (j'obtiens le contenu du répertoire racine, le contenu de chaque sous-répertoire du répertoire racine, mais pas le contenu des niveaux suivants :? ).
Quelqu'un pourrait m'éclairer, svp ?
Merci.

Posté : 26 avr. 2005, 08:02
par afbilou
Petite erreur toute bete :)

dans ton list_dir($file) (le tout dernier) il faut mettre :
list_dir($dir."/".$file);

Bonne continuation ;)

Posté : 26 avr. 2005, 09:54
par Chidi
euh, ce n'est pas mieux :(
ça me fait une erreur : Warning: opendir(Resource id #1/un_repertoire): failed to open dir....

Quelqu'un aurait-il la solution ? :?

Posté : 26 avr. 2005, 09:58
par zeus
Déjà pense bien à mettre ton code entre balise PHP, ça donne plus envie de le lire !!! Après, n peu d'indentation n'a jamais fait de mal, et c'est aussi plus faciel à lire !!! Et quand c'est plus facile, on a plus envie de t'aider !!!
function list_dir($path) {
  if ($dir = opendir($path)) {
    while($file = readdir($dir)) {
      echo "$file\n";
      if(is_dir($file) && !in_array($file, array(".", ".."))) {
        list_dir($file);
      }
    }
    closedir($dir);
  }
}
Je me penche sur ton problème !!!

Posté : 26 avr. 2005, 10:09
par zeus
Alors, premierement, il faut que tu remplace
list_dir($dir."/".$file); 
Par
list_dir($path."/".$file);


Ensuite, tu ne rentre jamais dans le if (is_dir($file)). J'ai fait un echo dans cette boucle et ça ne rentre pas !!!!

Je continue à chercher

Posté : 26 avr. 2005, 10:20
par afbilou
Bah c toujours le meme probleme ...

Son is_dir et sont dernier list_dir doivent avoir pour argument $path."/".$file

J'avais esperé que ce soit une erreur d'innatention de sa part ... mais non il n'a pas compris comment ca marche en fait. Donc lecture et relecture de la doc s'impose ^-^

Posté : 26 avr. 2005, 10:27
par Chidi
Ca y est, ça marche :D
Merci à vous !

donc voici le code qui marche bien :
function list_dir($path) {
  if ($dir = opendir($path)) { 
    while($file = readdir($dir)) {
      echo "$file\n"; 
      if(is_dir($path."/".$file) && !in_array($file, array(".", ".."))) { 
        list_dir($path."/".$file); 
      } 
    } 
    closedir($dir); 
  } 
}
Encore merci :wink:

Posté : 26 avr. 2005, 10:30
par zeus
afbilou à raison. La fonction is_dir demande un chemin complet !!! J'avais pas fait gaffe :oops:, c'est en relisant le code et en me rendant compte que $file était juste le nom d'un fichier que je m'en suis rendu compte. :?

Voiçi le code corrigé et revu :
function list_dir($path) {
  if ($dir = opendir($path)) {
    while($file = readdir($dir)) {
      echo "$file\n<BR>";
      if(is_dir($path."\\".$file)  && !in_array($file, array('.', '..'))) {
		list_dir($path."\\".$file); 
      }
    }
    closedir($dir);
  }
}