Remove a folder and its contents recursively with PHP

PHP for all it’s wonderful things can’t delete a non-empty folder. Every time I have to delete a folder I looked it up in google and used the first code that would sort of work. Well today I needed to delete folders but I needed something robust that handled errors better than what I was able to find. So here is my recursive directory delete function:

function RemoveDir($path){	
	if($path == ""){ return true; }
	if(!file_exists($path)){ return true; }
	if(is_dir($path)){
		$handle = opendir($path);		
		while(false !== ($entry = readdir($handle))){
			if ($entry != '.' && $entry != '..') {
				$result = RemoveDir($path.'\\'.$entry);
				if($result == false){ return false;}
			}
		}	
		closedir($handle);
		if(!rmdir($path))
		{
			return false;
		}
	}else{
		chmod($path,0777);
		if(!unlink($path))
			return false;
		}
	}
	return true;
}

First I check to see if we have something valid to delete. If we are trying to delete something non existent then we have succeeded. This is handled by:

if($path == ""){ return true; }
if(!file_exists($path)){ return true; }

We also need a to define the final statement in our case the lowest possible solution is deleting a single file:

	chmod($path,0777);
	if(!unlink($path))
		return false;
	}

in case we fail we return false, We use the false to stop the recursive call. Now the magic happens on this next statement:

if(is_dir($path)){
	$handle = opendir($path);		
	while(false !== ($entry = readdir($handle))){
		if ($entry != '.' && $entry != '..') {
		$result = RemoveDir($path.'\\'.$entry);
		if($result == false){ return false;}
		}
	}	
	closedir($handle);
	if(!rmdir($path))
	{
		return false;
	}
}

We start by opening the directory and parsing all of its entries then we pass the entries back to our function. In case we obtain a false result we stop by returning false. If no error are found then we simply delete the given path.

I hope someone finds this helpful

  1. A coworker stored production assets in Dropbox. Chaos ensued.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.