【问题标题】:Why does isDot() fail on me? (PHP)为什么 isDot() 对我失败? (PHP)
【发布时间】:2023-04-07 11:59:01
【问题描述】:

我正在完成一个列出目录中文件的代码段。我在目录中列出文件没有问题,但由于某种原因,我可以让 isDot() 方法工作以确保文件不是“。”要么 ”..” 。以下导致此错误:

Fatal error: Call to undefined method SplFileInfo::isDot() in ....

在我切换到使用递归迭代器之前,我使用的是目录迭代器,它运行良好。下面的代码有什么问题吗?它应该可以工作。

$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathToFolder));

//if there is a subdirectory it makes sure the proper extension is passed
foreach($files as $name => $file){      

            if (!$file->isDot()) {    //this is where it shuts me down          

            $realfile = str_replace($pathToFolder, "", $file);
            $url = getDownloadLink($folderID, $realfile);
        $fileArray[] = $url;            

        }       
}

【问题讨论】:

    标签: php iterator


    【解决方案1】:

    这是因为DirectoryIterator::current()(该方法,即在foreach-循环中调用)返回一个对象,该对象本身就是DirectoryIterator 类型。 FileSystemIterator(即RecursiveDirectoryIterator 扩展)默认返回SplFileInfo 的对象。您可以通过flags

    影响回报
    $files = new RecursiveIteratorIterator(
      new RecursiveDirectoryIterator(
        $pathToFolder,
        FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_SELF));
    

    但在您的情况下,如果项目是点文件,则无需测试。只需设置FilesystemIterator::SKIP_DOTS,它们根本不会出现。请注意,这也是default behavior

    【讨论】:

    • 很好的解释!感谢您向我解释。
    • 不知道是不是改了,但FilesystemIterator::SKIP_DOTS 不再是 RecursiveDirectoryIterator 的默认值了。
    【解决方案2】:

    另一个答案很好,但是对于不同的方法,您可以设置 SKIP_DOTS标志:

    <?php
    
    $o_dir = new RecursiveDirectoryIterator($pathToFolder);
    $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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2011-04-28
      • 2017-09-11
      • 2014-04-08
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      相关资源
      最近更新 更多