16
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) {
  echo "$file\n";
}

リストしようとしているディレクトリ内に読み取り不可能なサブディレクトリがある場合に、このコードがUnexpectedValueException「dirを開けませんでした:アクセスが拒否されました」をスローしない方法はありますか?

アップデート

ラップインに変換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) {
    }
};

読み取り不可能なサブディレクトリがある場合、は無限ループです。

4

2 に答える 2

24

どうやら$flags、コンストラクターにパラメーターを渡すことができます。ドキュメントにはフラグが1つだけありますが、それはまさにあなたが望むことをします:catches exceptions during getChildren() calls and simply jumps to the next element

クラス作成コードを次のように変更します

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

そしてそれはうまくいくはずです

于 2010-12-28T22:30:01.933 に答える
8

あなたはこのようなことをすることができます:

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";
}
于 2010-12-28T18:28:34.123 に答える