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

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

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

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

有没有在PHP脚本命令?

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

此代码在树视图中按sorting顺序列出所有目录和文件。 这是一个网站地图生成器,超链接到所有的网站资源。 完整的网页源代码在这里。 你需要从最后改变第九行的path。

 <?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是使用directoryIterator重新实现@Shef回答

 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)并生成一个ASCIIgraphics树。

 $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, "|");

我真的很喜欢SPL库,他们提供了迭代器,包括RecursiveDirectoryIterator 。

看看glob()或recursion目录迭代器 。

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

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

你也可以试试这个:

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

展会后期,但要build立的接受的答案 …

如果你想以数组的forms拥有所有的文件和目录(可以用JSON.stringify在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) ); }); 

^这是假设你在你的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来显示标签(垂直pipe道),alignment所有键值,删除键引号和其他一些东西。 我会修改这个答案的链接,如果我得到了上传,或获得足够的兴趣。

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

}

如果您正在寻找列出解决scheme的recursion目录并将其排列在multidimensional array中。 使用下面的代码:

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

这是一个简单的函数,用scandirarray_filter来完成这个工作。 使用正则expression式过滤需要的文件。 我删除了. ..和隐藏的文件,如.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');