Php 目录迭代器和递归目录迭代器
我必须列出目录中的所有文件和文件夹:Php 目录迭代器和递归目录迭代器,php,recursion,iterator,Php,Recursion,Iterator,我必须列出目录中的所有文件和文件夹: $images = array(); $dirs = array(); $dir = new DirectoryIterator($upload_dir_real); foreach ($dir as $file) { if ($file->isDot()) { continue
$images = array();
$dirs = array();
$dir = new DirectoryIterator($upload_dir_real);
foreach ($dir as $file) {
if ($file->isDot()) {
continue;
}
if ($file->isDir()) {
// dir
$scanned_dirs[] = $file->getPath();
continue;
} else {
// file
//echo $file->getFilename() . "<br>\n";//DEBUG
$realfile = $file->getFilename() . "<br>\n";
$realpath = $file->getPathname();
echo realpath($realfile);//DEBUG
$file->getFilename();
$images[] = realpath( $realpath );
}
}
这实际上调用了递归迭代器两次?我的意思是,如果它是递归的,它就不能递归两次:-)
2b-为什么找不到filesystememitter
,即使PHP手册声明(据我所知)它是递归迭代器构建的一部分
(这些问题是因为我想更好地理解,而不仅仅是复制和粘贴答案)
3-是否有更好的方法跨平台列出所有文件夹和文件?
- 1-为什么其他公认答案中描述的方法对我不起作用`
据我所知。代码工作得很好,但是您的实现是错误的,您使用的是以下代码
代码
而不是
$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real));
- 在同一个答案中,实际上调用递归迭代器两次??我的意思是,如果它是递归的,它就不能递归两次…:-)李>
不,没有区别
RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
^ ^
- 为什么找不到FileSystemEditor,即使php手册声明(据我所知)它是递归迭代器构建基础的一部分
您在评论中已经回答说,您正在使用不再支持或推荐的PHP版本5.2.9
- 3-是否有更好的方法跨平台列出所有文件夹和文件
既然已经解决了这个问题,您只需要filesystememitter::SKIP_DOTS
就不必调用$file->isDot()
范例
$fullPath = __DIR__;
$dirs = $files = array();
$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path ) {
$path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString());
}
var_dump($files, $dirs);
下面是另一种方法,利用setFlags
:
<?php
$o_dir = new RecursiveDirectoryIterator('.');
$o_dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);
foreach ($o_iter as $o_info) {
echo $o_info->getPathname(), "\n";
}
PHP 5.3中引入了FileSystemEditor
,API文档仅表示基于它的RecursiveDirectoryIterator
的当前状态。在上一段代码中,您没有两次使用RII,而是使用了一个RII和一个RDI。。我错过了RII和RDI-谢谢,(php版本也有解释-我使用5.2.9),但仍然-我如何使用is_dot或同等版本??如何使该函数工作?好的-谢谢(再次…:-),但它给了我相同的错误致命错误:找不到类'FileSystemEmitter'
-是否有其他方法可以避免在我的php版本上出现相同的错误?只是一个简单的问题。。为什么您仍在使用不再受支持的php版本,即5.2.9
嗯-这不是一个很好的答案-我的本地开发服务器就是这样。我从来没有遇到过任何问题(我是一个新手),但也许是时候同时升级我的技能和我的服务器了……php版本低的原因主要是因为兼容性支持。我使用wordpress开发(它仍然通过codex页面支持5.2.4
),并且我遇到了许多仍然安装了该版本(5.2.9)
的服务器。如果能知道在php中是否可以使用递归迭代器,那就太好了
RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
^ ^
$fullPath = __DIR__;
$dirs = $files = array();
$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path ) {
$path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString());
}
var_dump($files, $dirs);
<?php
$o_dir = new RecursiveDirectoryIterator('.');
$o_dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);
foreach ($o_iter as $o_info) {
echo $o_info->getPathname(), "\n";
}