【问题标题】:Can I make RecursiveDirectoryIterator skip unreadable directories?我可以让 RecursiveDirectoryIterator 跳过不可读的目录吗?
【发布时间】: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


【解决方案1】:

显然你可以将$flags 参数传递给构造函数。只有one flag in the docs,但它完全符合您的要求:catches exceptions during getChildren() calls and simply jumps to the next element

将你的类创建代码更改为

new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator("."), 
    RecursiveIteratorIterator::LEAVES_ONLY,
    RecursiveIteratorIterator::CATCH_GET_CHILD);

它应该可以工作

【讨论】:

  • 这正是我所需要的。非常感谢!
  • 我在这里遇到了类似的问题stackoverflow.com/questions/14410899/… 你有什么想法可以修改你的解决方案来解决我的问题吗?
  • 具体来说,标志是:CATCH_GET_CHILD
【解决方案2】:

你可以这样做:

class ReadableFilter extends RecursiveFilterIterator{
    public function accept(){
            return $this->current()->isReadable();
    }
}

$filteredIterator = new RecursiveIteratorIterator(new ReadableFilter(new RecursiveDirectoryIterator(".")));

foreach ($filteredIterator as $file){
    echo "$file\n";
}

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2013-02-04
    • 2012-02-27
    • 1970-01-01
    • 2015-04-03
    • 2014-06-29
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多