使用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 . "| "; } 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 . "| "; } 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>' ?>
这是一个简单的函数,用scandir
& array_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');