使用php列出目录中的所有文件夹、子文件夹和文件

使用php列出目录中的所有文件夹、子文件夹和文件,php,directory,Php,Directory,请给我一个使用php列出目录中所有文件夹、子文件夹和文件的解决方案。我的文件夹结构如下所示: Main Dir Dir1 SubDir1 File1 File2 SubDir2 File3 File4 Dir2 SubDir3 File5 File6 SubDir4 File7 File8 我想得到每个文件夹中所有文件的列表 php中有任何shell脚本命令吗?看一下或。scandir()我非常喜欢SPL库,它们提供迭代器,包

请给我一个使用php列出目录中所有文件夹、子文件夹和文件的解决方案。我的文件夹结构如下所示:

Main Dir
 Dir1
  SubDir1
   File1
   File2
  SubDir2
   File3
   File4
 Dir2
  SubDir3
   File5
   File6
  SubDir4
   File7
   File8
我想得到每个文件夹中所有文件的列表


php中有任何shell脚本命令吗?

看一下或。

scandir()
我非常喜欢SPL库,它们提供迭代器,包括。

函数listFolderFiles($dir){
$ffs=斯堪的纳维亚($dir);
未设置($ffs[数组搜索('.',$ffs,true)];
未设置($ffs[array_search('..',$ffs,true)];
//防止空的有序元素
如果(计数($ffs)<1)
返回;
回声';
foreach($ffs作为$ff){
回音“
  • ”。$ff; if(is_dir($dir./'.$ff))listFolderFiles($dir./'.$ff); 回音“
  • ”; } 回声'; } listFolderFiles(“主目录”);
    您也可以尝试以下方法:

    <?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);
    ?>
    
    
    
    定义('PATH',$\u服务器['DOCUMENT\u ROOT'])。目录名($\u服务器['PHP\u SELF']);
    $dir=新的目录迭代器(路径);
    回声“
      ”; foreach($dir作为$fileinfo) { 如果(!$fileinfo->isDot()){ 回音“
    • ”; 回音“”; } } 回声“
    ”;
    此代码在树状视图中按排序顺序列出所有目录和文件。它是一个站点地图生成器,具有指向所有站点资源的超链接。完整的网页来源在这里。您需要更改从末尾开始的第九行上的路径

    <?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>
    
    
    站点地图
    站点地图
    


    如果您想使用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');
    
    以下函数是@Shef answer与
    directoryinterator

    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');
    
    函数listFolderFiles($dir)
    {
    回声';
    foreach(新的DirectoryIterator($dir)作为$fileInfo){
    如果(!$fileInfo->isDot()){
    回显“
  • ”。$fileInfo->getFilename(); 如果($fileInfo->isDir()){ listFolderFiles($fileInfo->getPathname()); } 回音“
  • ”; } } 回声'; } listFolderFiles(“主目录”);
    显示文件夹结构的一种非常简单的方法是使用递归树编辑器类(PHP5>=5.3.0,PHP7)并生成ASCII图形树

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


    还可以通过使用
    RecursiveTreeIterator::setPrefixPart
    更改前缀来控制树的ASCII表示形式,例如
    $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT,“|”)

    节目晚了,但要在

    如果希望将所有文件和目录都放在as数组中(可以在javascript中很好地进行预绑定),可以将函数修改为:

    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;
    }
    
    对于新手…

    要使用前面提到的
    JSON.stringify
    ,您的JS/jQuery如下所示:

    var ajax = $.ajax({
        method: 'POST',
        data: {list_dirs: true}
    }).done(function(msg) {
        $('pre').html(
            'FILE LAYOUT<br/>' + 
                JSON.stringify(JSON.parse(msg), null, 4)
        );
    });
    
    您已经拥有以前的
    listFolderFiles

    在我的例子中,我已经将我的
    $rootPath
    设置为站点的根目录

    |    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...
    
    最终的结果是

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

    注意:您的将不会完全像这样-我已经修改了
    JSON.stringify
    以显示选项卡(垂直管道),对齐所有键控值,删除键的引号,以及其他一些事情。如果我想上传这个答案,或者有足够的兴趣,我会用一个链接来修改它。

    它将用来制作目录格式的菜单栏

    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);
        }
    }
    
    $pathLen=0;
    功能前置($level)
    {
    $ss=“”;
    对于($ii=0;$ii<$level;$ii++)
    {
    $ss=$ss.“|”;
    }
    返回$ss;
    }
    函数myScanDir($dir、$level、$rootLen)
    {
    全球$pathLen;
    如果($handle=opendir($dir)){
    $allFiles=array();
    while(false!==($entry=readdir($handle))){
    如果($entry!=“&&&$entry!=”){
    if(is_dir($dir./“$entry))
    {
    $allFiles[]=“D:.$dir./.”$entry;
    }
    其他的
    {
    $allFiles[]=“F:.$dir./.”$entry;
    }
    }
    }
    closedir($handle);
    natsort($allFiles);
    foreach($allFiles作为$value)
    {
    $displayName=substr($value$rootLen+4);
    $fileName=substr($value,3);
    $linkName=str_replace(“,”,substr($value,$pathLen+3));
    if(is_dir($fileName))
    {
    回声“
  • ”; } $t; 如果($level!=0) { 如果($t级<$t) { $r=int($t)-int($level); 对于($i=0;$i)

  • 如果要查找递归目录,请列出解决方案并将其排列在多维数组中。请使用以下代码:

    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');
    

    这里有一个简单的函数,它使用
    scandir
    array\u filter
    来完成这项工作。filter 使用正则表达式所需的文件。我删除了
    和隐藏文件,如
    .htaccess
    ,您还可以使用
    和颜色自定义输出,还可以在没有扫描或空目录的情况下自定义错误

    <!DOCTYPE html>
    <head><title>Displays Folder Contents</title></head>
    <?php
    
    function frmtFolder($Entity){
     echo '<li style="font-weight:bold;color:black;list-style-type:none">' . $Entity;
    }
    
    function frmtFile($dEntry, $fEntry){
    echo '<li style="list-style-type:square">' . '<a href="' . $dEntry . '/' . $fEntry . 
    '"> ' . $fEntry . ' </a>';
    }
    
    function listFolderFiles($dir) {
    $ffs = scandir($dir);
    
    unset($ffs[array_search('.', $ffs, true)]);
    unset($ffs[array_search('..', $ffs, true)]);
    unset($ffs[array_search('index.html', $ffs, true)]);
    // prevent empty ordered elements
    if (count($ffs) < 1) {return;}
    echo '<ul>';
    foreach ($ffs as $ff) {
        if (is_dir($dir . '/' . $ff)) {
         frmtFolder($dir);
        } else {
         frmtFile($dir, $ff);
        }
        if (is_dir($dir . '/' . $ff)) {
            listFolderFiles($dir . '/' . $ff);
        }
        echo '</li>';
    }
    echo '</ul>';
    }
    listFolderFiles('Folder_To_List_Here');
    
    函数getAllContentOfLocation($loc) { $scandir=scandir($loc); $scandir=array\u filter($scandir,function($element){ return!preg_match('/^\./',$element); }); if(empty($scandir))回显“
  • 空目录”; foreach($scandir作为$file){ $baseLink=$loc.DIRECTORY\u SEPARATOR.$file; 回声'; if(is_dir($baseLink)) { echo“
  • .”文件“
  • ”; getAllContentOfLocation($baseLink); }否则{
    <?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>'
    
    ?>
    
    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');
    
    /**
     * 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;
    }
    
    <!DOCTYPE html>
    <head><title>Displays Folder Contents</title></head>
    <?php
    
    function frmtFolder($Entity){
     echo '<li style="font-weight:bold;color:black;list-style-type:none">' . $Entity;
    }
    
    function frmtFile($dEntry, $fEntry){
    echo '<li style="list-style-type:square">' . '<a href="' . $dEntry . '/' . $fEntry . 
    '"> ' . $fEntry . ' </a>';
    }
    
    function listFolderFiles($dir) {
    $ffs = scandir($dir);
    
    unset($ffs[array_search('.', $ffs, true)]);
    unset($ffs[array_search('..', $ffs, true)]);
    unset($ffs[array_search('index.html', $ffs, true)]);
    // prevent empty ordered elements
    if (count($ffs) < 1) {return;}
    echo '<ul>';
    foreach ($ffs as $ff) {
        if (is_dir($dir . '/' . $ff)) {
         frmtFolder($dir);
        } else {
         frmtFile($dir, $ff);
        }
        if (is_dir($dir . '/' . $ff)) {
            listFolderFiles($dir . '/' . $ff);
        }
        echo '</li>';
    }
    echo '</ul>';
    }
    listFolderFiles('Folder_To_List_Here');
    
    // Does not support flag GLOB_BRACE        
    function glob_recursive($pattern, $flags = 0) {
        $files = glob($pattern, $flags);
        foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
            $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
        }
        return $files;
    }
    
    $paths = glob_recursive(os_path_join($base_path, $current_directory, "*"));
    
    [
    '/home/dir',
    '/home/dir/image.png',
    '/home/dir/subdir',
    '/home/dir/subdir/file.php',
    ]
    
    $paths = glob_recursive(os_path_join($base_path, $directory, "*"));
    
    function os_path_join(...$parts) {
      return preg_replace('#'.DIRECTORY_SEPARATOR.'+#', DIRECTORY_SEPARATOR, implode(DIRECTORY_SEPARATOR, array_filter($parts)));
    }
    
    $paths = glob_recursive(os_path_join($base_path, $current_directory, "*"));
    $subdirs = array_filter($paths, function($path) {
        return is_dir($path);
    });
    
    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;
    }