删除文件夹,所有内部内容函数返回“目录不为空”

时间:2019-07-18 10:09:19

标签: php rmdir

以下是我尝试删除的文件夹及其所有内容。文件夹可能包含zip文件以及包含文件的文件夹。

public function deleteFolder($dir){
    if(file_exists($dir)){
        $it = new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS);
        $files = new \RecursiveIteratorIterator($it,
                         \RecursiveIteratorIterator::CHILD_FIRST);
        foreach($files as $file) {
            if ($file->isDir()){
                rmdir($file->getRealPath());
            } else {
                unlink($file->getRealPath());
            }
        }
        rmdir($dir);
    }           
}

但它返回以下错误:

  

rmdir(C:\ Juliver \ UIUX \ pd-loader \ loader / temp / utso-pulgada-pd-loader-5066a7e0298a):

     

第95行的C:\ Juliver \ UIUX \ pd-loader \ loader \ Patcher.php中的目录不为空

line 95指向rmdir($dir);

如果我检查文件夹 utso-pulgada-pd-loader-5066a7e0298a ,我会发现它已经空了,但会引发上述错误。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

$dirname = 'C:/Users/Admin/Desktop/test';
array_map('unlink', glob("$dirname/*.*"));
rmdir($dirname);

尝试此操作,这将删除该文件夹中存在的所有文件,并且也删除该文件夹

答案 1 :(得分:0)

目录可能包含其他目录,因此您必须使用递归函数。

function removeDir($path) {
    $files = glob("$path/*");
    foreach ($files as $file) {
        if (is_dir($file)) {
            removeDir($file);
        } else {
            unlink($file);
        }
    }

    rmdir($path);
}

现在足以调用removeDir(“ / my / nice / path”); 如果您发现目录已经为空,请尝试检查隐藏文件并确保您具有正确的权限。

答案 2 :(得分:0)

我怀疑您已经检查了它不是文件权限问题。由于您的代码对我有用,但对我不起作用,这使我想知道这与PHP文件状态或Real Path缓存有关。

取消链接文件应自动清除单个文件的状态缓存。但是,PHP错误中有previously been known to cause this issue with rmdir

尝试在您的foreach块中的rmdir语句之后执行clearstatcache

以前我用过glob(在其他答案中已经提到过),所以我不知道RecursiveDirectoryIterator如何在重新处理文件句柄时起作用。作为长镜头,尝试在最终rmdir之前销毁这些对象(unset($files); unset($it))。