PHP的递归删除目录函数?

rho*_*son 26 php directory recursion

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

GalleryName /图片/

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

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

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

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

任何帮助,将不胜感激.

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

bar*_*hin 88

这个问题怎么样?

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

  • +1代表最短的代码,可能是最好和最快的工作解决方案:) (12认同)
  • `$ path-> isFile()?unlink($ path-> getPathname()):rmdir($ path-> getPathname());`应该是`$ path-> isDir()?rmdir($ path-> getPathname()):unlink($ path-> getPathname());`所以处理链接. (3认同)

rho*_*son 14

This is the recursive function I've created/modifed and that finally seems to be working. Hopefully there isn't anything too dangerous in it.

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