如何删除非空目录?

zec*_*ude 44 php directory

我试图删除一个目录rmdir,但我收到了"目录不为空"的消息,因为它仍然有文件.

我可以使用什么功能删除包含其中所有文件的目录?

Joh*_*ica 101

没有内置函数可以执行此操作,但请参阅http://us3.php.net/rmdir底部的注释.许多评论者发布了他们自己的递归目录删除功能.你可以从这些中挑选.

这是一个看起来像样的人:

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 (!deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) {
            return false;
        }

    }

    return rmdir($dir);
}
Run Code Online (Sandbox Code Playgroud)

编辑:rm -rf如果你想保持简单,你可以调用.这确实使您的脚本仅限UNIX,因此请注意这一点.如果你走那条路我会尝试类似的东西:

function deleteDirectory($dir) {
    system('rm -rf ' . escapeshellarg($dir), $retval);
    return $retval == 0; // UNIX commands return zero on success
}
Run Code Online (Sandbox Code Playgroud)

  • 这是非常危险的,请添加检查以确保您没有删除重要的内容,例如“/”。 (3认同)

Abh*_*hay 7

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);
 }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*oCS 6

您可以随时尝试使用系统命令.

如果在linux上使用:rm -rf /dir 如果在Windows上使用:rd c:\dir /S /Q

在上面的帖子中(John Kugelman)我假设PHP解析器将在foreach中优化该scandir,但是我scandirforeach条件语句中使用它似乎是错误的.
您也可以只执行两个array_shift命令来删除,...不是始终检查循环.


Fat*_*ror 6

想不出比这更简单、更有效的方法来做到这一点

function removeDir($dirname) {
    if (is_dir($dirname)) {
        $dir = new RecursiveDirectoryIterator($dirname, RecursiveDirectoryIterator::SKIP_DOTS);
        foreach (new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::CHILD_FIRST) as $object) {
            if ($object->isFile()) {
                unlink($object);
            } elseif($object->isDir()) {
                rmdir($object);
            } else {
                throw new Exception('Unknown object type: '. $object->getFileName());
            }
        }
        rmdir($dirname); // Now remove myfolder
    } else {
        throw new Exception('This is not a directory');
    }
}


removeDir('./myfolder');
Run Code Online (Sandbox Code Playgroud)


Thi*_*iro 5

已经有很多解决方案,还有另一种可能性,使用 PHP 箭头函数使用更少的代码:

function rrmdir(string $directory): bool
{
    array_map(fn (string $file) => is_dir($file) ? rrmdir($file) : unlink($file), glob($directory . '/' . '*'));

    return rmdir($directory);
}
Run Code Online (Sandbox Code Playgroud)