PHP unlink()错误:"目录不为空"

时间:2017-06-12 09:37:39

标签: php

我有以下递归方法来删除目录及其所有子目录和文件:

protected function _rrmdir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != '.' && $object != '..') {
                if (filetype($dir . '/' . $object) == 'dir') {
                    _rrmdir($dir . '/' . $object);
                } else {
                    unlink($dir . '/' . $object);
                }
            }
        }

        reset($objects);
        rmdir($dir);
    }
}

有时会收到警告,"目录不为空"

该目录实际上是作为文件的临时持有者创建的。使用以下代码段从Internet下载文件:

file_put_contents($filename, file_get_contents($file))

下载(写入操作)后,将它们上传到网站(读取操作)。完成上传后,临时文件夹及其文件将被删除。

奇怪的是,当我查看临时文件夹时,那里没有文件。好像代码在最后一个文件被删除的过程中试图删除该文件夹?

任何想法可能有什么问题以及如何解决?我需要这个代码在Windows和* nix上运行,所以只有* nix解决方案不是一个选项。

1 个答案:

答案 0 :(得分:1)

常量DIRECTORY_SEPARATOR可能会帮助您兼容Windows / Unix。 对于非空文件夹,请尝试以下操作:

protected function _rrmdir($dir)
{
    if (is_dir($dir)) {
        $objects = scandir($dir);
        foreach ($objects as $object) {
            if ($object != '.' && $object != '..') {
                if (is_dir($dir . DIRECTORY_SEPARATOR . $object)) {
                    _rrmdir($dir . DIRECTORY_SEPARATOR . $object);
                } else {
                    if( is_file($dir . DIRECTORY_SEPARATOR . $object) ) {
                        if(!unlink($dir . DIRECTORY_SEPARATOR . $object)) {
                            // code in case the file was not removed
                        }
                        // wait a bit here?
                    } else {
                        // code for debug file permission issues
                    }
                }
            }
        }
        reset($objects);
        rmdir($dir);
    }
}

您可能会尝试删除权限不在php exec级别的文件 仅当没有读取权限时,is_file()方法才会返回FALSE,请注意执行所有者需要写入权限才能删除文件。