¿Eliminar el directorio que contiene archivos?
Me pregunto, ¿cuál es la forma más sencilla de eliminar un directorio con todos sus archivos?
Lo estoy usando rmdir(PATH . '/' . $value);
para eliminar una carpeta, sin embargo, si hay archivos dentro de ella, simplemente no puedo eliminarlos.
Hay al menos dos opciones disponibles hoy en día.
Antes de eliminar la carpeta, elimine todos sus archivos y carpetas (¡y esto significa recursividad!). Aquí hay un ejemplo:
function deleteDir(string $dirPath): void { if (! is_dir($dirPath)) { throw new InvalidArgumentException("$dirPath must be a directory"); } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } $files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) { if (is_dir($file)) { deleteDir($file); } else { unlink($file); } } rmdir($dirPath); }
Y si estás usando 5.2+ puedes usar un RecursiveIterator para hacerlo sin implementar la recursividad tú mismo:
function removeDir(string $dir): void { $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS); $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach($files as $file) { if ($file->isDir()){ rmdir($file->getPathname()); } else { unlink($file->getPathname()); } } rmdir($dir); }
Generalmente uso esto para eliminar todos los archivos en una carpeta:
array_map('unlink', glob("$dirname/*.*"));
Y luego puedes hacer
rmdir($dirname);
¿Cuál es la forma más sencilla de eliminar un directorio con todos sus archivos?
system("rm -rf ".escapeshellarg($dir));
Función corta que hace el trabajo:
function deleteDir($path) {
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}
Lo uso en una clase de Utils como esta:
class Utils {
public static function deleteDir($path) {
$class_func = array(__CLASS__, __FUNCTION__);
return is_file($path) ?
@unlink($path) :
array_map($class_func, glob($path.'/*')) == @rmdir($path);
}
}
Un gran poder conlleva una gran responsabilidad : cuando llamas a esta función con un valor vacío, eliminará archivos que comiencen en la raíz ( /
). Como medida de seguridad, puedes comprobar si la ruta está vacía:
function deleteDir($path) {
if (empty($path)) {
return false;
}
return is_file($path) ?
@unlink($path) :
array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
}