2

ディレクトリが存在するかどうかをテストし、存在する場合は削除し、その上に新しいディレクトリを作成するコードのチャンクがあります。それはかなり単純なはずです。

if(is_dir($directory)){
    $files = new RecursiveIteratorIterator(
              new RecursiveDirectoryIterator($directory,RecursiveDirectoryIterator::SKIP_DOTS),
              RecursiveIteratorIterator::CHILD_FIRST
            );
    foreach($files as $fileinfo){
        $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
        $todo($fileinfo->getRealPath());
    }
    rmdir($directory);
    //var_dump(is_dir($directory));
}

clearstatcache();
mkdir($directory,0744);  

ディレクトリがまだ存在しない場合、問題なくmkdir()動作します。しかし、ディレクトリが存在する場合、rmdir()ループは機能しますが、PHP はエラーをスローします。

PHP Error[2]: mkdir(): Permission Denied

コメント行は、呼び出し後もvar_dump()PHP がまだ$directoryディレクトリであると認識していることを示しています。rmdir()だから私はclearstatcache()それを更新するために使用しますが、それでもディレクトリが削除されたことを検出しません。ファイルシステムで調べると、ディレクトリは実際には削除されています。

(ディレクトリがなくなっている間に) スクリプトを再度実行すると、問題なく動作します。

誰でもこのエラーを解決する方法を理解できますか? 違いがある場合は、これを Win7/XAMPP 開発環境で PHP コマンド ライン スクリプトとして実行しています。

編集:

答えてくれた Wee Kiat と Phillip に感謝します。unset($files)解決策は、 beforeを使用rmdir()して再帰イテレータを閉じることでした。この再帰イテレータはまだ開いたままになっており、チョーク$directoryの原因となっていました。mkdir()以下のコードを参照してください。

4

1 に答える 1

3

$files が問題の原因となっている変数のようです。必要なことは、foreach ループの後で $files の設定を解除することであり、mkdir() を実行できるようになります。

if(is_dir($directory)){
    $files = new RecursiveIteratorIterator(
              new RecursiveDirectoryIterator($directory,RecursiveDirectoryIterator::SKIP_DOTS),
              RecursiveIteratorIterator::CHILD_FIRST
            );
        foreach($files as $fileinfo){
            $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
            $todo($fileinfo->getRealPath());
        }

    unset($files);

    rmdir($directory);
    //var_dump(is_dir($directory));
}
mkdir($directory,0744);  

しかし、なぜ $files が問題を引き起こしているのかわかりません。何か案は?

于 2012-07-17T03:09:45.553 に答える