79 votes

Liste de tous les dossiers, sous-dossiers et fichiers d'un répertoire en utilisant php

Veuillez me donner une solution pour lister tous les dossiers, sous-dossiers, fichiers dans un répertoire en utilisant php. La structure de mes dossiers est la suivante :

Main Dir
 Dir1
  SubDir1
   File1
   File2
  SubDir2
   File3
   File4
 Dir2
  SubDir3
   File5
   File6
  SubDir4
   File7
   File8

Je veux obtenir la liste de tous les fichiers contenus dans chaque dossier.

Existe-t-il une commande shell script en php ?

186voto

Shef Points 21595
function listFolderFiles($dir){
    $ffs = scandir($dir);

    unset($ffs[array_search('.', $ffs, true)]);
    unset($ffs[array_search('..', $ffs, true)]);

    // prevent empty ordered elements
    if (count($ffs) < 1)
        return;

    echo '<ol>';
    foreach($ffs as $ff){
        echo '<li>'.$ff;
        if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
        echo '</li>';
    }
    echo '</ol>';
}

listFolderFiles('Main Dir');

1 votes

Merci Shef, cela fonctionne bien. Y a-t-il une commande shell pour exécuter cela ?

1 votes

Non je vous demande s'il existe un seul shell script pour lister tous les dossiers et fichiers comme esec(find).

0 votes

@THOmas : Pas à ma connaissance. D'ailleurs, exec n'est pas autorisé partout, vous aurez donc des difficultés à l'utiliser.

20voto

jim_kastrin Points 364

Une façon très simple d'afficher la structure des dossiers fait usage de RecursiveTreeIterator (PHP 5 >= 5.3.0, PHP 7) et génère un arbre graphique ASCII.

$it = new RecursiveTreeIterator(new RecursiveDirectoryIterator("/path/to/dir", RecursiveDirectoryIterator::SKIP_DOTS));
foreach($it as $path) {
  echo $path."<br>";
}

http://php.net/manual/en/class.recursivetreeiterator.php

Il est également possible de contrôler la représentation ASCII de l'arbre en modifiant les préfixes à l'aide de la commande RecursiveTreeIterator::setPrefixPart par exemple $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");

1 votes

Exactement ce dont j'avais besoin, je change en $dir, RecursiveDirectoryIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS) pour obtenir des slashs. Mais je n'arrive pas à trouver comment éviter | | | |- sans str_replace.

1 votes

@Reign.85 Je n'ai pas non plus réussi à éviter ces personnages. Je ne suis pas sûr qu'un moyen soit prévu par la classe...

16voto

nbauers Points 21

Ce code liste tous les répertoires et fichiers dans un ordre trié dans une vue arborescente. C'est un générateur de plan du site avec des hyperliens vers toutes les ressources du site. La source complète de la page web est ici. Vous devrez modifier le chemin d'accès à la neuvième ligne en partant de la fin.

<?php
$pathLen = 0;

function prePad($level)
{
  $ss = "";

  for ($ii = 0;  $ii < $level;  $ii++)
  {
    $ss = $ss . "|&nbsp;&nbsp;";
  }

  return $ss;
}

function myScanDir($dir, $level, $rootLen)
{
  global $pathLen;

  if ($handle = opendir($dir)) {

    $allFiles = array();

    while (false !== ($entry = readdir($handle))) {
      if ($entry != "." && $entry != "..") {
        if (is_dir($dir . "/" . $entry))
        {
          $allFiles[] = "D: " . $dir . "/" . $entry;
        }
        else
        {
          $allFiles[] = "F: " . $dir . "/" . $entry;
        }
      }
    }
    closedir($handle);

    natsort($allFiles);

    foreach($allFiles as $value)
    {
      $displayName = substr($value, $rootLen + 4);
      $fileName    = substr($value, 3);
      $linkName    = str_replace(" ", "%20", substr($value, $pathLen + 3));
      if (is_dir($fileName)) {
        echo prePad($level) . $linkName . "<br>\n";
        myScanDir($fileName, $level + 1, strlen($fileName));
      } else {
        echo prePad($level) . "<a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a><br>\n";
      }
    }
  }
}

?><!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Site Map</title>
</head>

<body>
<h1>Site Map</h1>
<p style="font-family:'Courier New', Courier, monospace; font-size:small;">
<?php
  $root = '/home/someuser/www/website.com/public';

  $pathLen = strlen($root);

  myScanDir($root, 0, strlen($root)); ?>
</p>
</body>

</html>

0 votes

Excellente solution, serait-il facile de la rendre un peu plus jolie ?

14voto

WonderLand Points 1030

Dans le cas où vous voulez utiliser directoryIterator

La fonction suivante est une réimplémentation de la réponse de @Shef avec directoryIterator

function listFolderFiles($dir)
{
    echo '<ol>';
    foreach (new DirectoryIterator($dir) as $fileInfo) {
        if (!$fileInfo->isDot()) {
            echo '<li>' . $fileInfo->getFilename();
            if ($fileInfo->isDir()) {
                listFolderFiles($fileInfo->getPathname());
            }
            echo '</li>';
        }
    }
    echo '</ol>';
}
listFolderFiles('Main Dir');

0 votes

C'est bien d'enlever un peu de HTML et de le remplacer par echo $fileInfo->getPathname() .' \\ '. $fileInfo->getFilename() . " \n " ; et vous avez tous les fichiers et vous pouvez faire ce que vous voulez

4voto

Wesley van Opdorp Points 8536

J'aime beaucoup la bibliothèque SPL, elle propose des itérateurs, dont les suivants RecursiveDirectoryIterator .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X