6

SPLイテレータを使用してPHPで空のディレクトリのツリーを削除する方法に苦労しています。すべてのディレクトリが空である次のディレクトリ構造を検討してください。

/ topdir

  level1

       level2

私は次のことを試しました:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
    '/topdir', RecursiveIteratorIterator::CHILD_FIRST
));

foreach ($it as $file) {
    if ($file->isDir()) {
        rmdir((string)$file);
    }
}

ただしRecursiveIteratorIterator::CHILD_FIRST、最下位レベルのファイルがループの一部になるのを防ぎ、Directory not emptylevel1が空ではないため、標準のE_WARNINGを取得します。

SPLイテレータを使用して空のディレクトリのツリーを再帰的に削除するにはどうすればよいですか?glob注: 、、などを使用してこれを行う方法を知ってscandirいます。これらの/類似の機能をソリューションとして提供しないでください。

私はここで非常に初歩的な何かを見逃しているに違いないように感じます...

4

1 に答える 1

10

RecursiveIteratorIterator子ディレクトリの実際の訪問を行うのはそれです。唯一のRecursiveDirectoryIteratorハンドルを提供します。

したがって、 :RecursiveIteratorIteratorではなくにCHILD_FIRSTフラグを設定する必要があります。RecursiveDirectoryIterator

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/topdir', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($it as $file) {
    if ($file->isDir()) {
        rmdir((string)$file);
    }
}

警告を防ぐには、::SKIP_DOTSフラグをに追加しますRecursiveDirectoryIterator

于 2012-05-15T22:58:04.227 に答える