GlobIterator预装/斜杠到本地文件名

时间:2011-12-16 16:58:31

标签: php

所以我试图使用GlobIterator来统一一些文件参数处理。 (使用Iterator进行对称,并将RecursiveDirectoryIterator用于其他列表参数。)

但它具有当前目录的文件规范的特性:

 $dir = new GlobIterator("*.php");

这会在键和/条目名称之前添加FileObject斜杠。

     [pathName:SplFileInfo:private] => /index.php
     [fileName:SplFileInfo:private] => /index.php

使用它作为文件名迭代器不太有用。

因此GlobIterator不仅仅是Iterator中包含的1:1 glob()替换,如手册所示。 (1)但是为什么/会先加上?{1}}? (2)哪个标志会禁用此重写? FilesystemIterator::CURRENT_AS_FILEINFO是我的第一个假设,但没有帮助,::KEY_AS_PATHNAME。还有其他旗帜吗? (简洁手册和所有)

2 个答案:

答案 0 :(得分:1)

可以输出没有前导斜杠的文件名,如下所示:

<?php
$iterator = new GlobIterator("*.php");
$iterator->setFlags(FilesystemIterator::KEY_AS_FILENAME);
echo "Key as Filename:\n";
foreach ($iterator as $key => $fileinfo) {
    echo $key . "\n";
}
?>

输出:

Key as Filename:
apple.jpg
banana.jpg
example.php

GlobIterator延伸FilesystemIteratorsetFlags()的适用常量很好documented

答案 1 :(得分:0)

正如古老的中国谚语所说,如果你想要一个给你一个类似于glob()的输出的迭代器,那么只需使用一个frigging迭代器而不是glob。

所以我只是诉诸于此:

 $list = [
      new ArrayIterator(glob("*.php")),
      new ArrayIterator(glob("whatevers/*.php")),
      new RII(RecursiveDirectoryIterator("more")),
 ]

这给出了预期的统一文件名列表,没有{app}逻辑内的(strstr($glob,"/") ? "$glob" : "./$glob")包装或键/值探测。