【发布时间】:2011-05-31 15:43:01
【问题描述】:
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) {
echo "$file\n";
}
当我尝试列出的目录中有不可读的子目录时,此代码是否有任何方法不抛出 UnexpectedValueException“无法打开目录:权限被拒绝”?
更新
将foreach() 转换为while() 并显式调用Iterator::next() 包裹在try() catch {} 中没有帮助。这段代码:
$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("."));
while($iter->valid()) {
$file = $iter->current();
echo "$file\n";
try {
$iter->next();
} catch(UnexpectedValueException $e) {
}
};
如果有不可读的子目录,则为无限循环。
【问题讨论】:
-
将其包装到 try catch 块中。在 foreach 括号内创建新对象似乎是个坏主意
-
详细说明 s3v3n 的评论。这似乎是个坏主意,因为很难确定到底发生了什么。好的代码并不总是最小或最快的代码。
-
如果您知道什么是 RecursiveIteratorIterator 和 RecursiveDirectoryIterator 以及它们的常见用例,就不难确定会发生什么。代码很简单。
-
@s3v3n 你给了我一个将 foreach 转换为 while 并在 try {} catch 中显式调用迭代器 next() 的想法。不幸的是,它不起作用。
标签: php directory directory-walk