PHP 的递归删除目录函数?

2022-08-30 15:23:50

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

图库名称/图片/

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

我知道除非目录为空,否则这将不起作用。我花了一段时间试图构建一个递归函数,从顶部开始,然后如果它是一个文件,如果它是一个目录,那么每个空目录。rmdir()scandir()unlink()scandir()rmdir()

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

那么我错过了什么吗?或者人们至少使用一个经过验证的功能来执行此操作?

任何帮助将不胜感激。

PS:我相信你们在这里比 php.net 网站上的评论更信任你们 - 那里有数百个功能,但我很想听听你们中是否有人推荐一个。


答案 1

这又如何呢?

function rmdir_recursive($dirPath){
    if(!empty($dirPath) && is_dir($dirPath) ){
        $dirObj= new RecursiveDirectoryIterator($dirPath, RecursiveDirectoryIterator::SKIP_DOTS); //upper dirs not included,otherwise DISASTER HAPPENS :)
        $files = new RecursiveIteratorIterator($dirObj, RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($files as $path) 
            $path->isDir() && !$path->isLink() ? rmdir($path->getPathname()) : unlink($path->getPathname());
        rmdir($dirPath);
        return true;
    }
    return false;
}

答案 2

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

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); 
} 

推荐