Php 使用递归DirectoryIterator
可能重复:Php 使用递归DirectoryIterator,php,Php,可能重复: 我正在尝试使用RecursiveDirectoryIterator创建一个简单的文件浏览器,但似乎无法理解。。。需要帮忙吗 $cwd = '/path/to/somewhere'; if(isset($_GET['path']) && is_dir($cwd.$_GET['path'])) { $cwd .= $_GET['path']; } $dir = new RecursiveDirectoryIterator($cwd); $iter = new
我正在尝试使用RecursiveDirectoryIterator创建一个简单的文件浏览器,但似乎无法理解。。。需要帮忙吗
$cwd = '/path/to/somewhere';
if(isset($_GET['path']) && is_dir($cwd.$_GET['path'])) {
$cwd .= $_GET['path'];
}
$dir = new RecursiveDirectoryIterator($cwd);
$iter = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
while($iter->valid()) {
// skip unwanted directories
if(!$iter->isDot()) {
if($iter->isDir()) {
// output linked directory along with the number of files contained within
// for example: some_folder (13)
} else {
// output direct link to file
}
}
$iter->next();
}
不确定这是否是最好的方法,但我的印象是递归DirectoryIterator比opendir()和glob()方法都快。
SELF\u FIRST
和CHILD\u FIRST
与RecursiveDirectoryIterator
无关,而recursiveIteratoryIterator
如果你跑
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::SELF_FIRST );
foreach ( $iterator as $path ) {
if ($path->isDir()) {
print($path->__toString() . PHP_EOL);
} else {
print($path->__toString() . PHP_EOL);
}
你会得到
...\htdocs\lab\stockoverflow\css
...\htdocs\lab\stockoverflow\css\a.css
...\htdocs\lab\stockoverflow\css\b.css
...\htdocs\lab\stockoverflow\css\c.css
...\htdocs\lab\stockoverflow\css\css.php
...\htdocs\lab\stockoverflow\css\css.run.php
如果先将其更改为递归迭代器::CHILD\u
...\htdocs\lab\stockoverflow\css\a.css
...\htdocs\lab\stockoverflow\css\b.css
...\htdocs\lab\stockoverflow\css\c.css
...\htdocs\lab\stockoverflow\css\css.php
...\htdocs\lab\stockoverflow\css\css.run.php
...\htdocs\lab\stockoverflow\css
你能看到当前文件夹位置的差异吗?你到底想弄清楚什么?@martin先生最后的评论是什么?“你能看到当前文件夹位置的差异吗?”指在处理子项之前或之后处理的
..\htdocs\lab\stockoverflow\css
文件夹。您如何摆脱点文件夹(
,。
)?海报使用了$path->isDot()
,但此方法不存在。我想您需要手动检查!在数组中($path->getBasename(),[“,”)
foreach循环实际迭代的是什么?换句话说,$path变量是什么类型的?我在PHP文档中没有看到这些信息。