PHP Function to Recursively Delete a Folder’s Contents Programming 04 SEP 2009

kung-fu-php-logoThe following function is useful if you wish to clear out all files and folders currently sitting in one particular directory. The function itself requires two parameters, the first being the full path to the directory that your wish to clear out, and the second being a simple TRUE/FALSE that controls whether or not the function needs to try and delete the folder it is trying to clean or simple empty its contents.

In other words, to use this function to totally remove a directory:
-> recursive_remove_directory(‘path/to/directory/to/delete’,FALSE);

To use this function to empty a directory:
-> recursive_remove_directory(‘path/to/full_directory’,TRUE);

Please note the script assumes that you, or rather PHP, has the necessary access rights in order to delete any files or folders that it comes across.

An example usage of the function would be:

if (recursive_remove_directory(str_replace(‘//’,'/’,$_SERVER['DOCUMENT_ROOT'] . ‘/uploads’),TRUE)) { 
echo ‘folder should now be empty’; 
} else { 
echo ‘folder clean process seems to have failed’; 

And now for the actual function itself:

function recursive_remove_directory($directory, $empty = FALSE) {
    // if the path has a slash at the end we remove it here 
    if (substr($directory, -1) == '/') {
        $directory = substr($directory, 0, -1);

    // if the path is not valid or is not a directory … 
    if (!file_exists($directory) || !is_dir($directory)) {
        // … we return false and exit the function 
        return FALSE;

// … if the path is not readable 
    } elseif (!is_readable($directory)) {
// … we return false and exit the function 
        return FALSE;

// … else if the path is readable 
    } else {

// we open the directory 
        $handle = opendir($directory);

// and scan through the items inside 
        while (FALSE !== ($item = readdir($handle))) {
// if the filepointer is not the current directory 
// or the parent directory 
            if ($item != '.' && $item != '..') {
// we build the new path to delete 
                $path = $directory . '/' . $item;

// if the new path is a directory 
                if (is_dir($path)) {
// we call this function with the new path 

// if the new path is a file 
                } else {
// we remove the file 
// close the directory 

// if the option to empty is not set to true 
        if ($empty == FALSE) {
// try to delete the now empty directory 
            if (!rmdir($directory)) {
// return false if not possible 
                return FALSE;
// return success 
        return TRUE;
Related Posts:

About Craig Lotter

South African software architect and developer at Touchwork. Husband to a cupcake baker and father to two little girls. I don't have time for myself any more.