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

问题描述:

请给我一个列出所有文件夹,子文件夹,文件的解决方案。我的文件夹结构是这样的:使用php列出目录中的所有文件夹子文件夹和文件请使用php

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

我想获得每个文件夹内的所有文件的列表。

在PHP中是否有任何shell脚本命令?

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

谢谢Shef它工作正常他们的任何shell命令执行此? – Warrior

+2

'php file_name.php'? – Shef

+1

不,我问你是否有任何单一的shell脚本列出所有的文件夹和文件,如esec(查找) – Warrior

我真的很喜欢SPL图书馆,他们提供迭代器,包括RecursiveDirectoryIterator

你也可以试试这个:

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

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

这个代码列出所有目录和文件的树状视图排序顺序。这是一个站点地图生成器,具有所有站点资源的超链接。完整的网页源代码在这里。您需要从最后改变第九行的路径。

<?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> 
+1

我爱你的解决方案。 –

+0

优秀的解决方案,是否容易让它更漂亮? – Kilisi

如果你想使用directoryIterator

下面的函数重新实现@Shef答案与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'); 

一个非常简单的方式来显示文件夹结构利用了RecursiveTreeIterator类(PHP 5> = 5.3.0,PHP 7)并生成一个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

也有通过改变使用RecursiveTreeIterator::setPrefixPart前缀树多的ASCII表示一定的控制,例如$it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");

+0

正是我所需要的,我更改为$ dir,RecursiveDirectoryIterator :: SKIP_DOTS | FilesystemIterator :: UNIX_PATHS)来获得斜杠。但无法想象如何避免| | | | - 没有str_replace –

+0

@ Reign.85我也没有设法避免这些字符。我不确定班级是否提供了一种方式...... –

晚的演出,而是建立关accepted answer的...

如果你想要所有的文件和目录在数组中(这可以用在JavaScript中JSON.stringify很好地预装),你c的修改功能:

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

^这是假设你的HTML中有一个<pre>元素。任何AJAX的味道都可以,但我想大多数人都在使用类似于上面的jQuery的东西。

和附带的PHP:

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

,你已经有listFolderFiles从之前。

就我而言,我已经把我的$rootPath到网站的根目录...

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

最终的结果是一样的东西......

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

注:你的看起来不会像这样 - 我修改了JSON.stringify来显示标签(垂直管道),对齐所有键值,删除键引号和其他一些东西。如果我想要上传它,或者获得足够的兴趣,我会通过链接修改此答案。

它将使用,使菜单栏在目录格式

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

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

}

如果你正在寻找一个递归目录列表的解决方案和多维数组进行排列。使用下面的代码:

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

?> 

这里是scandir & array_filter来完成这项工作的简单功能。使用正则表达式过滤 需要的文件。我删除了...和隐藏文件如.htaccess,您还可以使用<ul>和颜色自定义输出,并且还可以自定义错误,以防没有扫描或空目录!

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