【问题标题】:Remove Directory recursively递归删除目录
【发布时间】:2014-05-12 04:26:40
【问题描述】:

我在 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

【问题讨论】:

  • 你在哪里调用函数?
  • /webservice/passkit/class/Pass.php 的第 32 行是什么?
  • 函数是类的一部分:缺少$this-> 或静态引用。
  • 你应该逐步调试(var_udmp($dir)
  • 我尝试了 var_dump,但没有任何结果。想过“不允许操作”,但之前我把chmod设置为0777。

标签: php recursion


【解决方案1】:

如果函数属于一个类,那么它应该这样调用

$this->deleteDirectory($dir . "/" . $item)

而不是

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

【讨论】:

  • 如果它是一个类的一部分,那不就是一个“方法”吗?
  • 是的,你是对的@ghoti stackoverflow.com/questions/4841605/…
  • 是的,我们称它为方法,但 php 在错误或类定义中没有说“方法”。所以“功能”这个词在这里有点含糊。所以事实上@Dikesh(很可能)在他的建议中是正确的。
【解决方案2】:

当你使用类时,你必须将方法调用为$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);
    }

【讨论】:

  • 我尝试了您建议的这种方法:并在“foreach”之后和第一个 if 语句之前插入了以下行: chmod($dir . "/" . $item, 0777);但这不被脚本接受
  • 我的意思是,如果您尝试访问 /var/www (即执行根目录)文件夹之外的目录。然后从终端设置权限。不是来自代码。在代码中不要在递归函数中设置权限。
  • 啊好吧。我正在使用 sys_get_temp_dir() 函数创建动态临时文件夹。我该如何设置他们的权限?
  • 我不会说在调用 deleteDirectory 方法之前使用类似的东西。 system("/bin/chmod -R $mod $dir");
  • 我相信在终端设置权限后,您的问题将得到解决。希望如此。祝你好运。
猜你喜欢
  • 2018-10-15
  • 2010-10-21
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多