我必须列出目录中的所有文件和文件夹:
$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 );
}
}
这样可以正常工作(没有错误),但当然只计算根,所以我尝试了递归:
$images = array();
$dirs = array();
$dir = new RecursiveDirectoryIterator($upload_dir_real);
foreach ($dir as $file) {
if ($file->isDot()) {
continue;
}
if ($file->isDir()) {
// dir
$scanned_dirs[] = $file->getsubPath();
continue;
} else {
// file
//echo $file->getFilename() . "<br>\n"; //DEBUG
$realfile = $file->getsubFilename() . "<br>\n";
$realpath = $file->getsubPathname();
echo realpath($realfile);//DEBUG
$file->getFilename();
$images[] = realpath( $realpath );
}
}
基本上,我用getPath();
(等效)更改了getsubPath()
。问题是它给了我一个错误:
Fatal error: Call to undefined method SplFileInfo::isDot() in blah blah path
所以我搜索了一会儿,发现了这个:
Why does isDot() fail on me? (PHP)
这基本上是同样的问题,但是当我尝试时,我收到了这个错误:
Fatal error: Class 'FilesystemIterator' not found in in blah blah path
问题:
1 - 为什么另一个接受的答案中描述的方法对我不起作用? 2 - 在同一个答案中,以下代码是什么:
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$pathToFolder,
FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF));
这实际上是两次调用RecursiveIteratorIterator
?我的意思是,如果它是递归的,它不能递归两次: - )
2b - 怎么没找到FilesystemIterator
,即使PHP手册说明(据我的理解)它是构建递归迭代器的一部分?
(这些问题是因为我想要更好地理解,而不仅仅是复制和粘贴答案)。
3 - 是否有更好的方法可以跨平台列出所有文件夹和文件?
答案 0 :(得分:5)
据我所知。代码完美无缺,但您使用以下
实现错误代码
$dir = new RecursiveDirectoryIterator($upload_dir_real);
而不是
$dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real));
不,它没有它的不同
RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
^ ^
您已经在评论中回答说您已经使用不再支持或推荐的PHP版5.2.9
了
既然已经解决了所有问题FilesystemIterator::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);
答案 1 :(得分:1)
这是另一种利用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";
}