【问题标题】:Directory iterator and recursive directory iterator目录迭代器和递归目录迭代器
【发布时间】:2012-11-06 20:04:21
【问题描述】:

我必须列出目录中的所有文件和文件夹:

            $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 的当前状态。在上一个 sn-p 中,您没有使用两次 RII,而是有一个 RII 和一个 RDI。
  • 你用的是什么版本的PHP
  • ooh .. 我错过了 RII 和 RDI - 谢谢,(也解释了 php 版本 - 我使用 5.2.9)但仍然 - 我如何使用 is_dot 或等效项?如何让这个功能发挥作用?

标签: php recursion iterator


【解决方案1】:
  • 1 - 为什么其他接受的答案中描述的方法对我不起作用??`

据我所知。代码运行良好,但你的实现是错误的,你正在使用以下

代码

   $dir = new RecursiveDirectoryIterator($upload_dir_real);

代替

    $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real));
  • 在同一个答案中实际上调用了 RecursiveIteratorIterator 两次??我的意思是,如果它是递归的,它就不能递归两次...... :-))

不不一样

RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
            ^                             ^                    
  • 为什么找不到 FilesystemIterator,即使 php 手册声明(据我所知)它是递归迭代器所基于的一部分??

您已经在评论中回答您自己使用的是 PHP 版本 5.2.9,不再支持或推荐

  • 3 - 有没有更好的方法来跨平台列出所有文件夹和文件??

既然已经解决了,你只需要FilesystemIterator::SKIP_DOTS,你就不必打电话给$file-&gt;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);

【讨论】:

  • 好的 - 谢谢(再次... :-) )但它给了我同样的错误Fatal error: Class 'FilesystemIterator' not found - 有没有其他方法可以用来避免我的php版本出现同样的错误?
  • 只是一个简单的问题.. 为什么您仍在使用不再支持的 php 版本 5.2.9
  • 好吧 - 这个问题没有好的答案 - 我的本地 DEV 服务器就是这样。我从来没有遇到过任何问题(我是个新手),但也许是时候同时升级我的技能和服务器了......
  • php版本低的原因主要是兼容性支持。我使用 wordpress 开发(仍然支持 5.2.4 通过它的 codex 页面)并且我遇到了很多仍然安装此版本 (5.2.9 is) 的服务器。很高兴知道是否可以在php&lt;5.3中进行递归迭代器
【解决方案2】:

这是另一种方法,利用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";
}

https://php.net/filesystemiterator.setflags

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多