GlobIterator 在本地文件名前面加上 / 斜杠

GlobIterator prepends / slash to local filenames

提问人:mario 提问时间:12/17/2011 最后编辑:Charlesmario 更新时间:12/22/2011 访问量:1075

问:

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

但它对当前目录的文件规范有一个特殊性:

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

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

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

这使得将其用作文件名迭代器变得不那么有用。

因此,并不像手册所建议的那样,仅仅是包装在迭代器中的 1:1 glob() 替换。(1) 但为什么 THE 无论如何都要被预置呢?(2) 哪个标志禁用了这种重写?FilesystemIterator::CURRENT_AS_FILEINFO 是我的第一个假设,但也没有帮助。还有其他标志吗?(简明手册和全部)GlobIterator/::KEY_AS_PATHNAME

PHP的

评论

0赞 Charles 12/17/2011
有志愿者参加源代码潜水吗?(链接是新的官方 PHP git 存储库。这是 SPL 的其余部分
0赞 goat 12/17/2011
我什至无法测试......我的 GlobIterator::next() 抛出异常。你可以使用 splFileInfo->getBasename()
0赞 mario 12/17/2011
没有多大意义。但它似乎取决于流包装器。github.com/php/php-src/blob/master/ext/spl/spl_directory.c#L698 - 无论哪种方式,它都可能是理想的行为,所有版本和 Windows 的 php.exe 都表现出这种行为。glob://*
0赞 mario 12/22/2011
@Marek:手册页显示 。现在我承认“相似”也可能意味着“有点相似,但不完全相似”,但这不是它所暗示的。(我将使用文档编辑器......Iterates through a file system in a similar fashion to glob().
0赞 12/22/2011
@mario 这个问题是错误的,因为它基于一个错误的假设,即手册说 GlobIterator 是 glob() 的 1:1 替代品。正如我所指出的,事实并非如此。因此,您接受的解决方案不是基于 GlobIterator。问题应该问:我可以用什么来代替glob()?

答:

1赞 user1080697 12/22/2011 #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() 的适用常量有据可查

评论

0赞 mario 12/22/2011
好吧,这并不完全是我一直在寻找的对称性(我仍然必须预先检查 glob 模式,不要像 一样获得有效的相对路径),但这为它提供了一些启示。(只给了我基本名称,并且仍然具有这种特殊性。*.phpdir/*.phpglob()_AS_FILENAMEKEY_AS_PATHNAME
0赞 12/22/2011
@mario,如果你正在寻找的“对称性”存在,那当然会很好,但实际上,没有什么比魔术标志更能将 GlobIterator 的行为从当前完全改变到你指定的了。这是你能得到的最好的。使用 $fileinfo 访问扩展信息,并使用 $key 获取文件名。旁注:pathinfo() 在解析路径中的信息时可能很方便。如果你认为 GlobIterator 应该是 glob() 的 1:1 替代品,你可能想在 PHP 愿望清单上添加一个功能请求。
0赞 2 revsmario #2

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

所以我只是求助于:

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

这提供了预期的统一文件名列表,而无需在应用逻辑中进行换行或键/值探测。(strstr($glob,"/") ? "$glob" : "./$glob")

评论

1赞 mario 12/22/2011
“✔” 表示这可能不是最好的方法,但可以满足 OP 的需求。