Répertorier tous les sous-dossiers et les fichiers dans un répertoire en utilisant php

s'il vous Plaît me donner une solution pour la liste de tous les dossiers,sous-dossiers,fichiers dans un répertoire à l'aide de php. La structure de mon dossier 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 à l'intérieur de chaque dossier.

y a-t-il une commande de script shell en php?

51
demandé sur McMuffin 2011-08-19 16:22:13

15 réponses

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');
130
répondu Shef 2017-05-21 14:16:28

ce code répertorie tous les répertoires et fichiers Classés par ordre dans une arborescence. C'est un générateur de carte du site avec des hyperliens vers toutes les ressources du site. La source complète de la page web est ici. Vous devez changer le chemin sur la neuvième ligne à partir 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>
12
répondu nbauers 2014-07-15 12:29:36

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');
10
répondu WonderLand 2014-12-11 14:01:00

une façon très simple d'afficher la structure d'un dossier utilise la classe 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 y a aussi un certain contrôle sur la représentation ASCII de l'arbre en changeant les préfixes en utilisant RecursiveTreeIterator::setPrefixPart , par exemple $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");

7
répondu jim_kastrin 2016-05-31 14:29:58

je suis vraiment fan de bibliothèque SPL, ils offrent iterator's, y compris RecursiveDirectoryIterator .

4
répondu Wesley van Opdorp 2011-08-19 12:27:17
2
répondu pritaeas 2011-08-19 12:24:43
2
répondu Rijk 2011-08-19 12:25:05

il sera utilisé pour faire la barre de menu dans le format de répertoire

$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(" ", " ", substr($value, $pathLen + 3));


        if (is_dir($fileName))
         {
               echo "<li ><a class='dropdown'><span>" . $displayName . "                    </span></a><ul>";

          myScanDir($fileName, $level + 1, strlen($fileName));
            echo "</ul></li>";
  } 
        else {
      $newstring = substr($displayName, -3);  
      if($newstring == "PDF" || $newstring == "pdf" )

          echo "<li ><a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a></li>";

        }
  $t;
        if($level != 0)
        {
          if($level < $t)
          {
        $r = int($t) - int($level);
        for($i=0;$i<$r;$i++)
        {
            echo "</ul></li>";
        }
          } 
        }
              $t = $level;
      }
          }

        }
        ?>

                                        <li style="color: #ffffff">

                                                <?php                                                   
   //  ListFolder('D:\PDF');
     $root = 'D:\PDF';
   $pathLen = strlen($root);

    myScanDir($root, 0, strlen($root)); 
     ?>


                                        </li>
2
répondu Venkatesh Parihar 2016-08-24 12:45:50
function GetDir($dir) {
if(is_dir($dir)) {
    if($kami= opendir($dir)){
        while($file = readdir($kami)){
            if($file != '.' && $file != '..'){
                if(is_dir($dir . $file)){
                    echo $dir . $file;
                    // since it is a directory we recurse it.
                    GetDir($dir . $file . '/');
                }else{
                    echo $dir . $file;   
                }
            }
        }
    }
    closedir($kami);         
    }

}

1
répondu kamran Sheikh 2017-05-06 12:10:00

si vous êtes à la recherche d'un répertoire récursif solutions de listage et de les organiser dans un tableau multidimensionnel. Utiliser le code ci-dessous:

<?php
/**
 * Function for recursive directory file list search as an array.
 *
 * @param mixed $dir Main Directory Path.
 *
 * @return array
 */
function listFolderFiles($dir)
{
    $fileInfo     = scandir($dir);
    $allFileLists = [];

    foreach ($fileInfo as $folder) {
        if ($folder !== '.' && $folder !== '..') {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) {
                $allFileLists[$folder] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
            } else {
                $allFileLists[$folder] = $folder;
            }
        }
    }

    return $allFileLists;
}//end listFolderFiles()


$dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc');
echo '<pre>';
print_r($dir);
echo '</pre>'

?>
1
répondu Faisal 2017-05-27 18:33:31

Voici une fonction simple avec scandir et array_filter qui font le travail. filtrer les fichiers nécessaires en utilisant regex. J'ai supprimé . .. et les fichiers cachés comme .htaccess , vous pouvez également personnaliser la sortie en utilisant <ul> et les couleurs et aussi personnaliser les erreurs dans le cas où aucun scan ou des dirs vides!.

function getAllContentOfLocation($loc)
{   
    $scandir = scandir($loc);

    $scandir = array_filter($scandir, function($element){

        return !preg_match('/^\./', $element);

    });

    if(empty($scandir)) echo '<li style="color:red">Empty Dir</li>';

    foreach($scandir as $file){

        $baseLink = $loc . DIRECTORY_SEPARATOR . $file;

        echo '<ol>';
        if(is_dir($baseLink))
        {
            echo '<li style="font-weight:bold;color:blue">'.$file.'</li>';
            getAllContentOfLocation($baseLink);

        }else{
            echo '<li>'.$file.'</li>';
        }
        echo '</ol>';
    }
}
//Call function and set location that you want to scan 
getAllContentOfLocation('../app');
1
répondu ABD ELLATIF LAKEHAL 2017-07-03 17:01:52

vous pouvez aussi essayer ceci:

<?php
function listdirs($dir) {
    static $alldirs = array();
    $dirs = glob($dir . '/*', GLOB_ONLYDIR);
    if (count($dirs) > 0) {
        foreach ($dirs as $d) $alldirs[] = $d;
    }
    foreach ($dirs as $dir) listdirs($dir);
    return $alldirs;
}

$directory_list = listdirs('xampp');
print_r($directory_list);
?>
0
répondu Neha Singh 2014-04-01 12:04:33
define ('PATH', $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']));
$dir = new DirectoryIterator(PATH);
echo '<ul>';
foreach ($dir as $fileinfo)
{   
    if (!$fileinfo->isDot()) {
       echo '<li><a href="'.$fileinfo->getFilename().'" target="_blank">'.$fileinfo->getFilename().'</a></li>'; 

       echo '</li>';
    }
}
echo '</ul>';
0
répondu Gaurang P 2014-04-01 12:31:03

la Fin de l'émission, mais pour se développer à partir de la accepté de répondre ...

si vous voulez avoir tous les fichiers et répertoires en as array (qui peuvent être bien pré-assemblés avec JSON.stringify en javascript), vous pouvez modifier la fonction en:

function listFolderFiles($dir) { 
    $arr = array();
    $ffs = scandir($dir);

    foreach($ffs as $ff) {
        if($ff != '.' && $ff != '..') {
            $arr[$ff] = array();
            if(is_dir($dir.'/'.$ff)) {
                $arr[$ff] = listFolderFiles($dir.'/'.$ff);
            }
        }
    }

    return $arr;
}

Pour les Débutants...

pour utiliser le susnommé JSON.stringify , votre JS / jQuery serait quelque chose comme:

var ajax = $.ajax({
    method: 'POST',
    data: {list_dirs: true}
}).done(function(msg) {
    $('pre').html(
        'FILE LAYOUT<br/>' + 
            JSON.stringify(JSON.parse(msg), null, 4)
    );
});

^ ceci suppose que vous avez un élément <pre> dans votre HTML quelque part. N'importe quelle saveur D'AJAX fera l'affaire, mais je suppose que la plupart des gens utilisent quelque chose de similaire au jQuery ci-dessus.

et le PHP qui l'accompagne:

if(isset($_POST['list_dirs'])) {
    echo json_encode(listFolderFiles($rootPath));
    exit();
}

où vous avez déjà listFolderFiles d'avant.

dans mon cas, j'ai placé mon $rootPath dans le répertoire racine du site...

$rootPath; 
if(!isset($rootPath)) {
    $rootPath = $_SERVER['DOCUMENT_ROOT'];
}

Le résultat final est quelque chose comme...

|    some_file_1487.smthng    []
|    some_file_8752.smthng    []
|    CSS    
|    |    some_file_3615.smthng    []
|    |    some_file_8151.smthng    []
|    |    some_file_7571.smthng    []
|    |    some_file_5641.smthng    []
|    |    some_file_7305.smthng    []
|    |    some_file_9527.smthng    []
|    
|    IMAGES    
|    |    some_file_4515.smthng    []
|    |    some_file_1335.smthng    []
|    |    some_file_1819.smthng    []
|    |    some_file_9188.smthng    []
|    |    some_file_4760.smthng    []
|    |    some_file_7347.smthng    []
|    
|    JSScripts    
|    |    some_file_6449.smthng    []
|    |    some_file_7864.smthng    []
|    |    some_file_3899.smthng    []
|    |    google-code-prettify    
|    |    |    some_file_2090.smthng    []
|    |    |    some_file_5169.smthng    []
|    |    |    some_file_3426.smthng    []
|    |    |    some_file_8208.smthng    []
|    |    |    some_file_7581.smthng    []
|    |    |    some_file_4618.smthng    []
|    |    
|    |    some_file_3883.smthng    []
|    |    some_file_3713.smthng    []

... and so on...

Note: la vôtre ne ressemblera pas exactement à cela - j'ai modifié JSON.stringify pour afficher les onglets (tuyaux verticaux), aligner toutes les valeurs saisies, supprimer les guillemets sur les touches, et un couple d'autres choses. Je modifierai cette réponse avec un lien si jamais j'arrive à la télécharger, ou obtenir assez d'intérêt.

0
répondu Birrel 2017-05-23 12:34:50

je cherchais une fonction similaire. J'avais besoin de répertoires en tant que clés et de sous-répertoires en tant que Tableaux et fichiers juste placés en tant que valeurs.

J'ai utilisé le code suivant:

/**
 * Return an array of files found within a specified directory.
 * @param  string $dir   A valid directory. If a path, with a file at the end,
 *                       is passed, then the file is trimmed from the directory.
 * @param  string $regex Optional. If passed, all file names will be checked
 *                       against the expression, and only those that match will
 *                       be returned.
 *                       A RegEx can be just a string, where a '/' will be
 *                       prefixed and a '/i' will be suffixed. Alternatively,
 *                       a string could be a valid RegEx string.
 * @return array         An array of all files from that directory. If regex is
 *                       set, then this will be an array of any matching files.
 */
function get_files_in_dir(string $dir, $regex = null)
{
    $dir = is_dir($dir) ? $dir : dirname($dir);
    // A RegEx to check whether a RegEx is a valid RegEx :D
    $pass = preg_match("/^([^\\a-z ]).+([^\\a-z ])[a-z]*$/i", $regex, $matches);

    // Any non-regex string will be caught here.
    if (isset($regex) && !$pass) {
        //$regex = '/'.addslashes($regex).'/i';
        $regex = "/$regex/i";
    }

    // A valid regex delimiter with different delimiters will be caught here.
    if (!empty($matches) && $matches[1] !== $matches[2]) {
        $regex .= $matches[1] . 'i'; // Append first delimiter and i flag
    }

    try {
        $files = scandir($dir);
    } catch (Exception $ex) {
        $files = ['.', '..'];
    }
    $files = array_slice($files, 2); // Remove '.' and '..'
    $files = array_reduce($files, function($carry, $item) use ($regex) {
        if ((!empty($regex) && preg_match($regex, $item)) || empty($regex)) {
            array_push($carry, $item);
        }

        return $carry;
    }, []);

    return $files;
}

function str_finish($value, $cap)
{
    $quoted = preg_quote($cap, '/');

    return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap;
}

function get_directory_tree($dir)
{
    $fs = get_files_in_dir($dir);
    $files = array();

    foreach ($fs as $k => $f) {
        if (is_dir(Str::finish($dir, '/').$f)) {
            $fs[$f] = get_directory_tree(Str::finish($dir, '/').$f);
        } else {
            $files[] = $f;
        }
        unset($fs[$k]);

    }

    $fs = array_merge($fs, $files);

    return $fs;
}

il y a beaucoup à prendre.

la première fonction get_files_in_dir a été créée pour que je puisse obtenir tous les fichiers et dossiers dans un répertoire basé sur une expression régulière. Je l'utilise ici parce qu'il a une certaine vérification d'erreur à assurez-vous qu'un répertoire est converti en un tableau.

Ensuite, nous avons une simple fonction qui ajoute une barre oblique à la fin d'une chaîne si il n'en existe pas déjà.

enfin, nous avons la fonction get_directory_tree qui va itérer à travers tous les dossiers et sous-dossiers et créer un tableau associatif où les noms de dossiers sont les clés et les fichiers sont les valeurs (à moins que le dossier a sous dossiers).

0
répondu JustCarty 2018-08-30 11:52:01