我不得不列出目錄中的所有文件和文件夾:目錄迭代和遞歸目錄迭代器
$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 - 是否有更好的方式來列出跨平臺的所有文件夾和文件?
'FilesystemIterator'在PHP 5.3引入的,API文檔只是代表基於它的'RecursiveDirectoryIterator'的當前狀態。在你最後的片段中,你沒有使用RII兩次,你有一個RII和一個RDI。 – mario
您使用的是什麼版本的PHP – Baba
ooh ..我錯過了RII和RDI--謝謝,(PHP版本也解釋了 - 我使用5.2.9),但仍然 - 我怎樣才能使用is_dot或等價的?如何使這個功能起作用? –