Arborescence récursive

Arborescence récursive - PHP - Programmation

Marsh Posté le 29-12-2006 à 02:29:46    

Bonjour, je voudrais creer un fichier XML qui lit toute l'arborescence d'un dossier (pour mon cas le root de mon espace web(sauf pour l'exemple)), or mon code ne va pas plus loin qu'un seul dossier  :( je comprend pas, dites moi ou ca cloche
 
vous pouvez le tester ici

Code :
  1. <?php
  2. header ("Content-type: text/xml" );
  3. echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
  4. echo "<dir name='root'>\n";
  5. function list_dir($name) {
  6.  if ($dir = opendir($name)) {
  7.   while($file = readdir($dir)) {
  8.    if ($file != "." && $file != ".." ) {
  9.     if(is_dir($file)) {
  10.      echo "<dir name='$file'>\n";
  11.      list_dir($file);
  12.     }else{
  13.     echo "<file>$file</file>\n";
  14.     }
  15.    }
  16.   }
  17.  }
  18.  echo "</dir>";
  19.  closedir($dir);
  20. }
  21. list_dir("./" );
  22. ?>


 
merci de votre aide  :)


Message édité par stealth35 le 29-12-2006 à 02:30:36
Reply

Marsh Posté le 29-12-2006 à 02:29:46   

Reply

Marsh Posté le 29-12-2006 à 03:19:20    

Quand tu appelles ta fonction récursive (ligne 11) il faut que tu l'appelles avec comme argument le bon chemin!
Dans ton exemple : list_dir($name.'/'.$file);

Reply

Marsh Posté le 29-12-2006 à 03:24:21    

ca change rien puisque le pointeur est deja dans son dossier parent

Reply

Marsh Posté le 29-12-2006 à 03:32:13    

Y a aucun pointeur la dedans :s
 
Il faut ke tu transmette le chemin aux differentes instances de ta fonction recursive :s
Comment veux tu que ton opendir ouvre ton dossier '/pouet/graou/tartampion' si l'argument passé a list_dir est 'tartampion' :s
Tu dois donc transmettre '/pouet/graou' comme je te l'ai dis

Reply

Marsh Posté le 29-12-2006 à 03:44:56    

De plus le test de ta boucle readdir est faux !
Comme il est indiqué dans la doc, si tu tombes un jour sur un dossier nommé '0' (zéro) ton test de boucle sera evalué a FAUX et la boucle s'arretera prématurément!
 
Le bon test est donc :
while (($file = readdir($path)) !== false)

Reply

Marsh Posté le 29-12-2006 à 14:43:58    

merci de ton aide  :) , j'ai compris le probleme, sauf que ca marche toujour pas, dans le dossier 'battle' il y'a juste 2 autre dossier, donc avec la fonction is_dir il devrai dire que c'est des dossiers or il me met des fichiers je comprend pas ?
 
 

Code :
  1. <?php
  2. header ("Content-type: text/xml" );
  3.       echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
  4.      echo "<dir name='root'>\n";
  5.      function list_dir($name) {
  6.  if ($dir = opendir($name)) {
  7.              while(($file = readdir($dir)) !== false) {
  8.               if ($file != "." && $file != ".." ) {
  9.     $file = $name.$file;
  10.     if(is_dir($file)) {
  11.                           echo "<dir name='$file'>\n"; 
  12.      list_dir($file);                                           
  13.     }else{
  14.      echo "<file>$file</file>\n";   
  15.     }   
  16.    }
  17.    }
  18.   }
  19.  echo "</dir>";
  20.  closedir($dir);           
  21. }
  22. list_dir("./" )
  23. ?>


Message édité par stealth35 le 29-12-2006 à 15:07:06
Reply

Marsh Posté le 29-12-2006 à 15:08:45    

Et si tu bosses en PHP 5.1, utilises plutôt DirectoryIterator de l'extension SPL

Reply

Marsh Posté le 29-12-2006 à 15:09:26    

c'est bon ca marche, mais juste un petit probleme de nomage apres, je te remerci de m'avoir eclairer ;)
 
voila le code pour ceux que ca intersse
 

Code :
  1. <?php
  2. header ("Content-type: text/xml" );
  3.       echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
  4.      echo "<dir name='root'>\n";
  5.      function list_dir($name) {
  6.  if ($dir = opendir($name)) {
  7.              while(($file = readdir($dir)) !== false) {
  8.               if ($file != "." && $file != ".." ) {
  9.     $path = $name.'/'.$file;
  10.     if(is_dir($path)) {
  11.                           echo "<dir name='".substr($path, 2)."'>\n"; 
  12.      list_dir($path);                                           
  13.     }else{
  14.      echo "<file>$file</file>\n";   
  15.     }   
  16.    }
  17.    }
  18.   }
  19.  echo "</dir>";
  20.  closedir($dir);           
  21. }
  22. list_dir("./" )
  23. ?>


Message édité par stealth35 le 29-12-2006 à 15:38:24
Reply

Marsh Posté le 26-05-2008 à 15:49:48    

bon je reviens quelque année plus tard, en gros j'ai besoin de faire un menu dynamique en html, je veux utiliser les listes et avoir un truc du genre

 

Dossier 1 >
      sous dossier 1
      sous dossier 2
Dossier 2
Dossier 3 >
      sous dossier 1 >
              sous sous dossier 1
              sous sous dossier 2
      sous dossier 2
Dossier 4
Dossier 5
.....
...

 


bon la mon code bien sur n'est pas bon, au niveau affichage html ca marche c'est en gros le rendu que je voudrais avoir, je dois pas trop être loin du résultat mais la j'avoue je cale un peu

 
Code :
  1. function list_dir($name) {
  2.  if ($dir = opendir($name)) {
  3.             while(($file = readdir($dir)) !== false) {
  4.              if ($file != "." && $file != ".." ) {
  5.     $path = $name.'/'.$file;
  6.     $m = count(explode("/",$name)) - 1;
  7.     if(is_dir($path)) {
  8.      $n++;
  9.      if($n == "1" ){
  10.       echo "<ul>";
  11.      }
  12.      echo "\r<li>(".$n." ) ".$m." - ".$file;
  13.      list_dir($path);
  14.     }else{
  15.      //echo "-->";   
  16.     }
  17.    }
  18.   }
  19.   $n = 0;
  20.  }
  21.  echo "</li>";
  22.  closedir($dir);
  23. }


Message édité par stealth35 le 26-05-2008 à 17:01:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed