递归删除目录

3
我在PHP中编写了一个自定义的删除函数。该函数调用是递归的,但是在调用函数时,我会得到一个错误输出:
// custom delete directory function
function deleteDirectory($dir) {
    if (!file_exists($dir)) return true;
    if (!is_dir($dir) || is_link($dir)) return unlink($dir);
    foreach (scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;

        // THIS IS LINE 32 LIKE MENTIONED IN THE ERROR
        if (!$this->deleteDirectory($dir . "/" . $item)) {

             // THIS IS LINE 33 LIKE MENTIONED IN THE ERROR
            chmod($dir . "/" . $item, 0777);
            if (!$this->deleteDirectory($dir . "/" . $item)) return false;
        };
    }

    // THIS IS LINE 37 LIKE MENTIONED IN THE ERROR
    return rmdir($dir);
}

function cleanup() {
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->workFolder), RecursiveIteratorIterator::CHILD_FIRST);
    foreach ($files as $name => $fileObject) {
        if (is_file($name)) {
            unlink($name);
        } else if (is_dir($name)) {
            system("/bin/chmod -R 0777 $name");
            $this->deleteDirectory($name);
        }
    }
    $this->deleteDirectory($this->workFolder);
}

我尝试使用"$this->deleteDirectory()"方法,但现在我收到了一个完全不同的错误:
Warning: rmdir(/tmp/533aab0362830/.) [function.rmdir]: Invalid argument in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37

Warning: rmdir(/tmp/533aab0362830/../.ICE-unix) [function.rmdir]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37

Warning: chmod() [function.chmod]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 33

Warning: rmdir(/tmp/533aab0362830/../.ICE-unix) [function.rmdir]: Operation not permitted in /usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php on line 37

2
你在哪里调用这个函数? - Debflav
“/webservice/passkit/class/Pass.php” 的第32行是什么? - ghoti
3
函数是类的一部分:缺少$this->或静态引用。 - Salieri
可能是A recursive remove directory function for PHP?的重复问题。 - d.raev
我认为你在使用PHP语言时遇到了问题。在方法的开头,$dir打印出了什么?如果$dir为空,请抛出异常。也许你没有文件夹的正确权限,因此无法使用chmod() - Debflav
显示剩余2条评论
2个回答

2
如果函数属于一个类,则应按以下方式调用
$this->deleteDirectory($dir . "/" . $item)

替代

deleteDirectory($dir . "/" . $item)

1
如果它是类的一部分,那么它不就是一个“方法”吗? - ghoti
是的,@ghoti,你说得对。 - dikesh
2
是的,我们会称之为方法,但 PHP 在错误信息或类定义中并没有使用“方法”这个词。因此,“函数”这个术语在这里有点模糊不清。所以实际上 @Dikesh 的建议(很可能)是正确的。 - giorgio

1
当您使用类时,必须调用方法:$this->methodName()。 以下是对我有效的代码片段。 您可以尝试这个。如果它出现权限错误,则可以添加chmod函数。 请记住,如果您没有读取权限,则无法遍历目录。因此,请先设置权限。
   function deleteDirectory($dir) {
        if (!file_exists($dir)) return true;
        if (!is_dir($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
            if ($item == '.' || $item == '..') continue;
            if (!$this->deleteDirectory($dir.DIRECTORY_SEPARATOR.$item)) return false;
        }
        return rmdir($dir);
    }

这似乎可以工作,但我仍然在以下行中收到错误: return rmdir($dir); (无效参数和不允许的操作);警告:rmdir(/tmp/533ab2ea4a033/.) [function.rmdir]:无效参数,位于/usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php的第35行警告:rmdir(/tmp/533ab2ea4a033/../.ICE-unix) [function.rmdir]:不允许的操作,位于/usr/www/users/kontug/api.medifaktor.de/webservice/passkit/class/Pass.php的第35行 - konturgestaltung
“Operation not permitted” 意味着您正在以 www-data 用户身份运行该命令。如果您想访问其他目录,则必须为 root 或任何其他用户。您可以尝试使用此命令:“sudo /bin/chomod...”,如果您在 ubuntu 上,这将以 root 身份运行它。 - Vivek Muthal
是的,它可以在PHP中调用,它将进行系统调用,但我建议首先尝试不使用sudo。有关exec、system的更多信息,请参见https://dev59.com/93RB5IYBdhLWcg3wEDul。 - Vivek Muthal
我刚刚尝试了不使用sudo的调用,但仍然没有任何区别...抱歉。我不想打扰你!我只是编辑了问题:cleanup()方法。这样正确吗? - konturgestaltung
1
我相信在终端设置权限后,您的问题将得到解决。希望如此。祝你好运。 - Vivek Muthal
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接