2012-05-15 13 views
6

SPLイテレータを使用してPHPで空のディレクトリのツリーを削除する方法に苦労しています。私は次のことを試してみたPHP SPLイテレータで空のディレクトリを再帰的に削除

/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は、下のレベルのファイルを防ぐすべてのディレクトリが空である、次のディレクトリ構造を考えてみましょうループの一部ではなく、level1が空ではないため、標準Directory not empty E_WARNINGを取得します。

SPLイテレータを使用して空のディレクトリのツリーを再帰的に削除するにはどうすればよいですか?注:私はglobscandirなどでこれを行う方法を知っています。これらの/同様の機能をソリューションとして提供しないでください。私はここに非常に基本的な何かが欠けする必要がありますように私は感じ

は...

+1

::SKIP_DOTSフラグを追加しないようにするにはディレクトリ以外は何もありませんか? –

+0

OKはい、私は空のディレクトリでこのエラーを再現できました。 :) –

+0

はい。私はディレクトリ構造をこの問題のためのサニティチェックとして作成しました。 – rdlowrey

答えて

9

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

したがって、あなたはRecursiveDirectoryIteratorRecursiveIteratorIteratorにCHILD_FIRSTフラグを設定していないする必要があります。

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

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

あなたはすべてのこれらのディレクトリが含まれていることが確実な警告もRecursiveDirectoryIterator

関連する問題