Arborescence et fonction récursive

Chidi
Invité n'ayant pas de compte PHPfrance

25 avr. 2005, 23:16

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.

afbilou
Invité n'ayant pas de compte PHPfrance

26 avr. 2005, 08:02

Petite erreur toute bete :)

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

Bonne continuation ;)

Chidi
Invité n'ayant pas de compte PHPfrance

26 avr. 2005, 09:54

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 ? :?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 avr. 2005, 09:58

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 !!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 avr. 2005, 10:09

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

afbilou
Invité n'ayant pas de compte PHPfrance

26 avr. 2005, 10:20

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 ^-^

Chidi
Invité n'ayant pas de compte PHPfrance

26 avr. 2005, 10:27

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:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 avr. 2005, 10:30

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);
  }
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer