How can I delete a folder along with all subfolders and contained files with PHP

HI,

I need a way to remove a folder and all its sub folders and files with php.  

I know i can remove an empty folder with "rmdir", but in this case folder contains 3 subfolders, each of which contain several files, and I want to delete all the contents and the directory.
SusurrusAsked:
Who is Participating?
 
minibagoCommented:
I 'borrowed' this for you (I left in the originators details so you can thank him if you want though) from php.net document comments for rmdir().

This function builds on the suggestion by davedx, but doesn't keep going on failure.  It also doesn't remove dot-files, since those usually should be deleted explicitly.

Hope that helps you =)
Isaac Z dot Schlueter i at foohack dot com
 
<?php
/**
 * rm_recurse
 * @description Remove recursively. (Like `rm -r`)
 * @see Comment by davedx at gmail dot com on { http://us2.php.net/manual/en/function.rmdir.php }
 * @param file {String} The file or folder to be deleted.
 **/
function rm_recurse($file) {
    if (is_dir($file) && !is_link($file)) {
        foreach(glob($file.'/*') as $sf) {
            if ( !rm_recurse($sf) ) {
                error_log("Failed to remove $sf\n");
                return false;
            }
        }
        return rmdir($file);
    } else {
        return unlink($file);
    }
}
?>

Open in new window

0
 
ixtiCommented:
rmdir cannot delete non-empty dir, so you have to delete all subfoldera and files first. For example you can do it with function from code snippet. For more details, please check out http://ru2.php.net/rmdir
<?php
    // dan's comment (http://ru2.php.net/manual/ru/function.rmdir.php#81692)
    function remove_dir($dir)
    {
        if(is_dir($dir))
        {
            $dir = (substr($dir, -1) != "/")? $dir."/":$dir;
            $openDir = opendir($dir);
            while($file = readdir($openDir))
            {
                if(!in_array($file, array(".", "..")))
                {
                    if(!is_dir($dir.$file))
                        @unlink($dir.$file);
                    else
                        remove_dir($dir.$file);
                }
            }
            closedir($openDir);
            @rmdir($dir);
        }
    }
?>
 
// So now you can delete dir with:
 
<?php remove_dir('/path/to/dir/which/has/to/be/deleted');

Open in new window

0
 
ixtiCommented:
If minibago's solution will not work, try another (from php.net's):

<?php
function rm_recursive($filepath)
{
    if (is_dir($filepath) && !is_link($filepath))
    {
        if ($dh = opendir($filepath))
        {
            while (($sf = readdir($dh)) !== false)
            {
                if ($sf == '.' || $sf == '..')
                {
                    continue;
                }
                if (!rm_recursive($filepath.'/'.$sf))
                {
                    throw new Exception($filepath.'/'.$sf.' could not be deleted.');
                }
            }
            closedir($dh);
        }
        return rmdir($filepath);
    }
    return unlink($filepath);
}
?>

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.