As there currently does not exist a PHP function that allows developers to delete or copy entire (non-empty) directories at once one has to recursively loop through them to manually delete/copy their contents.
This post provides you with two easy to use functions for
- deleting entire (non-empty) directories
- copying entire (non-empty) directories
First, let’s start with the delete function:
/**
* Removes all files from $source, optionally ignoring SVN meta-data
* folders (default).
* @param string $source
* @return boolean
*/
public static function deleteDirectory($source, $excludeSvnFolders=true, $recusion=false) {
$dir_handle = opendir($source);
if (!$dir_handle)
return false;
while ($file = readdir($dir_handle)) {
if ($file == '.' || $file == '..')
continue;
if ($excludeSvnFolders && $file == '.svn')
continue;
if (!is_dir($source . '/' . $file)) {
unlink($source . '/' . $file);
} else {
self::deleteDirectory($source . '/' . $file, $excludeSvnFolders, true);
}
}
closedir($dir_handle);
if ($recusion) {
rmdir($source);
}
return true;
}
The second function handles copying entire directories:
/**
* Copies contents from $source to $dest, optionally ignoring SVN meta-data
* folders (default).
* @param string $source
* @param string $dest
* @param boolean $ignoreSvnFolders
* @return boolean true on success false otherwise
*/
public static function copyDirectory($source, $dest, $excludeSvnFolders=true) {
$sourceHandle = opendir($source);
if (!$sourceHandle) {
echo 'failed to copy directory: failed to open source ' . $source;
return false;
}
while ($file = readdir($sourceHandle)) {
if ($file == '.' || $file == '..')
continue;
if ($excludeSvnFolders && $file == '.svn')
continue;
if (is_dir($source . '/' . $file)) {
if (!file_exists($dest . '/' . $file)) {
mkdir($dest . '/' . $file, 0755);
}
self::copyDirectory($source . '/' . $file, $dest . '/' . $file, $excludeSvnFolders);
} else {
copy($source . '/' . $file, $dest . '/' . $file);
}
}
return true;
}
As you may have noticed both function are declared static. This is due to the fact that I am using them in a general purpose file management class.
Both functions offer the possibility to ignore SVN meta-data folders, i.e. .svn directories. Further improvements to these functions could be to extend them with an array of folders and files to exclude, instead of the boolean $excludeSvnFolders.
