为什么isDot()失败了? (PHP)

时间:2011-06-14 00:14:25

标签: php iterator

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

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

在我切换到使用Recursive Iterator之前,我使用的是Directory Iterator,它工作正常。下面的代码有什么问题吗?它应该工作。

$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;            

        }       
}

2 个答案:

答案 0 :(得分:30)

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

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

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

答案 1 :(得分:0)

另一个答案很好,但是对于其他方法,您可以设置 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