PHP的递归删除目录函数?

时间:2009-09-10 19:47:37

标签: php recursion directory

我正在使用PHP来移动图片子文件夹的内容

  

GalleryName /图像/

进入另一个文件夹。移动后,我需要删除GalleryName目录及其中的所有其他内容

我知道除非目录为空,否则rmdir()将无效。我花了一些时间尝试从顶部开始为scandir()构建递归函数,然后unlink()如果它是文件而scandir()如果它是一个目录,那么rmdir()我去的每个空目录。

到目前为止它的工作并不完全正确,我开始认为 - 这不是一个PHP应该能够做的非常简单的功能吗?删除目录?

那么我缺少什么?或者至少有一个人们用于此行动的经过验证的功能?

任何帮助都将不胜感激。

PS我相信你们所有人都比php.net网站上的评论更多 - 那里有数百种功能但是我很想知道你们这里是否有人推荐其他人。

7 个答案:

答案 0 :(得分:86)

这个问题怎么样?

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dirPath, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) {
        $path->isDir() && !$path->isLink() ? rmdir($path->getPathname()) : unlink($path->getPathname());
}
rmdir($dirPath);

答案 1 :(得分:14)

这是我创建/修改的递归函数,最终似乎正在工作。希望它没有任何危险。

function destroy_dir($dir) { 
    if (!is_dir($dir) || is_link($dir)) return unlink($dir); 
    foreach (scandir($dir) as $file) { 
        if ($file == '.' || $file == '..') continue; 
        if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) { 
            chmod($dir . DIRECTORY_SEPARATOR . $file, 0777); 
            if (!destroy_dir($dir . DIRECTORY_SEPARATOR . $file)) return false; 
        }; 
    } 
    return rmdir($dir); 
} 

答案 2 :(得分:2)

如果应用程序的服务器运行linux,只需使用shell_exec()函数,并为它提供rm -R命令,如下所示:

shell_exec("rm ".$dir_path." -R");

说明:

该函数将命令insert,直接插入linux。它与在linux终端中运行命令完全相同。

命令rm删除$dir_path中传递的文件或目录,-R选项告诉我们 系统以递归方式运行它。

答案 3 :(得分:0)

我已经改编了一个用点前缀处理隐藏的unix文件并使用glob:

的函数
public static function deleteDir($path) {
    if (!is_dir($path)) {
        throw new InvalidArgumentException("$path is not a directory");
    }
    if (substr($path, strlen($path) - 1, 1) != '/') {
        $path .= '/';
    }
    $dotfiles = glob($path . '.*', GLOB_MARK);
    $files = glob($path . '*', GLOB_MARK);
    $files = array_merge($files, $dotfiles);
    foreach ($files as $file) {
        if (basename($file) == '.' || basename($file) == '..') {
            continue;
        } else if (is_dir($file)) {
            self::deleteDir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($path);
}

答案 4 :(得分:0)

还有另一个帖子,其中包含更多示例: How do I recursively delete a directory and its entire contents (files + sub dirs) in PHP?

如果您正在使用Yii,那么您可以将其留在框架中:

CFileHelper::removeDirectory($my_directory);

答案 5 :(得分:0)

我更喜欢从php帮助页面http://php.net/manual/en/function.rmdir.php#115598

派生的enhaced方法
 // check accidential empty, root or relative pathes
 if (!empty($path) && ...)
 {
  if (PHP_OS === 'Windows')
  {
    exec('rd /s /q "'.$path.'"');
  }
  else
  {
      exec('rm -rf "'.$path.'"');
  }
}
else
{
    error_log('path not valid:$path'.var_export($path, true));
}

我决定的原因:

  • 少代码
  • 速度
  • 保持简单

答案 6 :(得分:0)

public static function rrmdir($dir)
{
    if (is_dir($dir)) {
        $files = scandir($dir);
        foreach ($files as $file) {
            if ($file != "." && $file != "..") {
                if (filetype($dir . "/" . $file) == "dir")
                    self::rrmdir($dir . "/" . $file);
                else
                    unlink($dir . "/" . $file);
            }
        }
        reset($files);
        rmdir($dir);
    }
}