Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP unlink()错误:";“目录不为空”;_Php - Fatal编程技术网

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

PHP unlink()错误:";“目录不为空”;,php,Php,我使用以下递归方法删除目录及其所有子目录和文件: protected function _rrmdir($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != '.' && $object != '..') { if (filetype($d

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

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的解决方案。

该常量可能会帮助您实现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级别的文件。

只有在没有读取权限的情况下,该方法才会返回
FALSE
,请注意,执行所有者需要写入权限才能删除文件。

目录中是否有“dotfiles”?(如果不允许php用户查看,这些命令可能不会显示在列表命令中)。对于隐藏文件和.db文件,类似情况也适用于windows。当您试图删除这些文件时,它们可能也在使用中,阻止删除它们,但我怀疑这会引发错误或警告。没有“dotfiles”。下载到文件夹中的文件是图像(主要是JPG)。创建这些文件夹只是为了作为这些图像的临时容器。在文件夹中不做任何其他操作。请尝试更改行
if(filetype($dir.'/'.$object)='dir'){
if(is_dir($dir.'/'.$object)){,就像您在方法开始时所做的那样。测试您的代码。记住,问题是间歇性的。感谢您建议使用
目录分隔符
is_file()
。我仍然间歇性地遇到问题(文件夹未被删除)。现在的区别是,我不再收到有关目录不为空的警告。rmdir()一定有问题吗?嗯……操作中的间歇性,可能是因为递归堆栈有时在操作系统实际删除“最后一个文件”之前变为空然后,在文件夹中,当执行堆栈中的顶部元素到达(父文件夹)时,操作系统没有释放指向导致警告的文件的链接。您在哪个操作系统中工作?如果这是真的,可能会得到unlink的响应,如
$result=unlink(…)
,或者在unlink命令后有一点睡眠。