提问人:mario 提问时间:12/17/2011 最后编辑:Charlesmario 更新时间:12/22/2011 访问量:1075
GlobIterator 在本地文件名前面加上 / 斜杠
GlobIterator prepends / slash to local filenames
问:
因此,我尝试使用 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
答:
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 扩展了 FilesystemIterator。setFlags() 的适用常量有据可查。
评论
0赞
mario
12/22/2011
好吧,这并不完全是我一直在寻找的对称性(我仍然必须预先检查 glob 模式,不要像 一样获得有效的相对路径),但这为它提供了一些启示。(只给了我基本名称,并且仍然具有这种特殊性。*.php
dir/*.php
glob()
_AS_FILENAME
KEY_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 的需求。
评论
glob://*
Iterates through a file system in a similar fashion to glob().