¿Eliminar el directorio que contiene archivos?

Resuelto matt asked hace 54 años • 36 respuestas

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.

matt avatar Jan 01 '70 08:01 matt
Aceptado

Hay al menos dos opciones disponibles hoy en día.

  1. 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);
    }
    
  2. 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);
    }
    
alcuadrado avatar Jul 28 '2010 03:07 alcuadrado

Generalmente uso esto para eliminar todos los archivos en una carpeta:

array_map('unlink', glob("$dirname/*.*"));

Y luego puedes hacer

rmdir($dirname);
user3033886 avatar Oct 17 '2014 11:10 user3033886

¿Cuál es la forma más sencilla de eliminar un directorio con todos sus archivos?

system("rm -rf ".escapeshellarg($dir));
Your Common Sense avatar Jul 28 '2010 04:07 Your Common Sense

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);
}
Blaise avatar Dec 31 '2011 13:12 Blaise