¿Eliminar directorio con archivos en él?

7 minutos de lectura

¿Eliminar directorio con archivos en el
mate

Me pregunto, ¿cuál es la forma más fácil de eliminar un directorio con todos sus archivos?

Estoy usando rmdir(PATH . "https://stackoverflow.com/" . $value); para eliminar una carpeta, sin embargo, si hay archivos dentro de ella, simplemente no puedo eliminarla.

  • posible duplicado de ¿Cómo elimino un directorio y todo su contenido (archivos + subdirectorios) en PHP?

    – Artefacto

    28 de julio de 2010 a las 3:45

  • sí, respondió exactamente en esa pregunta.

    – timdev

    28 de julio de 2010 a las 3:46

  • Solo quiero notar. Creé varios archivos y si durante el proceso aparece algún error, entonces necesito eliminar los archivos creados anteriormente. Cuando se crearon archivos, se olvidó de usar fclose($create_file); y cuando eliminé, obtuve Warning: unlink(created_file.xml): Permission denied in.... Por lo que para evitar este tipo de errores debe cerrar los archivos creados.

    – Andrés

    14 de abril de 2015 a las 3:47

  • Posible duplicado de ¿Cómo elimino recursivamente un directorio y todo su contenido (archivos + subdirectorios) en PHP?

    – Fifi

    6 de agosto de 2019 a las 12:50

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

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

Y luego puedes hacer

rmdir($dirname);

  • Esto no elimina carpetas recursivamente; solo funciona si la carpeta tiene solo archivos normales, todos los cuales tienen extensiones de archivo.

    – mgnb

    9 de julio de 2015 a las 2:04

  • Si no se necesita recursión, esta es la mejor y más simple respuesta hasta ahora. ¡Gracias!

    – eisbehr

    31 de octubre de 2016 a las 9:09

  • Para quitar todos archivos de una carpeta, no solo los que tienen extensiones, use glob de la siguiente manera: array_map('unlink', glob("$dirname/*")); Esto aún no le permite eliminar directorios anidados en la carpeta.

    – kremuwa

    9 de abril de 2018 a las 9:21

  • Tenga en cuenta que esto también eliminará los archivos de puntos (ocultos).

    – BadHorsie

    26 sep 2019 a las 13:39

  • Para eliminar carpetas recursivamente, solo hazlo array_map("unlink", glob("$dirname/*")); array_map("rmdir", glob("$dirname/*")); rmdir($dirname);.

    – Madeorsk

    29 de junio de 2021 a las 17:55

  • Espero que no hables en serio. ¿Qué sucede si $dir es /

    – El desarrollador de píxeles

    28 de julio de 2010 a las 4:46

  • @Exactamente lo mismo que con cualquiera de los códigos anteriores. ¿no es así?

    – Tu sentido común

    28 de julio de 2010 a las 8:33

  • Tenga en cuenta que, dependiendo de cómo $dir se genera/proporciona, es posible que deba realizar un preprocesamiento adicional para estar seguro y evitar errores. Por ejemplo, si $dir podría tener un espacio sin escape o un punto y coma, entonces podría haber efectos secundarios no deseados. Este no es el caso con las respuestas que usan cosas como rmdir() porque manejará los caracteres especiales por usted.

    – Trot

    3 de marzo de 2012 a las 22:12

  • Versión de Windows: system('rmdir '.escapeshellarg($path).' /s /q');

    – Cifrar

    19 de enero de 2014 a las 2:03

  • @ThePixelDeveloper Si su secuencia de comandos PHP tiene acceso para eliminar archivos/carpetas en el directorio raíz, tiene serios problemas de todos modos.

    – Marton Tamas

    13 oct 2018 a las 14:49

¿Eliminar directorio con archivos en el
Blaise

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);
    }
}

Con un gran poder viene una gran responsabilidad: Cuando llame a esta función con un valor vacío, eliminará los archivos que comiencen en la raíz (/). Como medida de seguridad, puede verificar 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);
}

  • El estático no funciona porque $this === NULL cuando llamas a una función estática en una clase. Funcionaría si $this_func = array(__CLASS__, __FUNCTION__);

    – Matt Connolly

    26 de julio de 2012 a las 2:09

  • alguien me puede explicar la linea array_map($class_func, glob($path.'/*')) == @rmdir($path)? Supongo que está recorriendo las subcarpetas, pero ¿qué hace la parte == @rmdir? ¿Cómo devuelve la respuesta == ? ¿Comprueba si cada valor de retorno de la recursividad es el mismo que el booleano de la derecha?

    – Arviman

    6 de enero de 2013 a las 23:32

  • Es un truco fusionar dos declaraciones en una declaración. Esto se debe a que los operadores ternarios permiten solo una declaración por argumento. array_map(...) elimina todos los archivos dentro del directorio, @rmdir(...) elimina el propio directorio.

    – Blaise

    7 de enero de 2013 a las 9:57

  • ¡Ten cuidado! Esta función no comprueba si la ruta realmente existe. Si pasa un argumento vacío, la función comenzará a eliminar archivos desde la raíz. Agregue una verificación de cordura a su ruta antes de ejecutar esta función.

    – Tatu Ulmanen

    24/10/2014 a las 13:34

  • Algunas personas no vieron el comentario de Tatu y lo borraron recursivamente. /así que agregué una versión protegida a mi publicación.

    – Blaise

    26 de noviembre de 2014 a las 10:25

Como se ve en el comentario más votado en la página del manual de PHP sobre rmdir() (ver http://php.net/manual/es/function.rmdir.php), glob() La función no devuelve archivos ocultos. scandir() se proporciona como una alternativa que resuelve ese problema.

El algoritmo descrito allí (que funcionó a las mil maravillas en mi caso) es:

<?php 
    function delTree($dir)
    { 
        $files = array_diff(scandir($dir), array('.', '..')); 

        foreach ($files as $file) { 
            (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); 
        }

        return rmdir($dir); 
    } 
?>

  • El estático no funciona porque $this === NULL cuando llamas a una función estática en una clase. Funcionaría si $this_func = array(__CLASS__, __FUNCTION__);

    – Matt Connolly

    26 de julio de 2012 a las 2:09

  • alguien me puede explicar la linea array_map($class_func, glob($path.'/*')) == @rmdir($path)? Supongo que está recorriendo las subcarpetas, pero ¿qué hace la parte == @rmdir? ¿Cómo devuelve la respuesta == ? ¿Comprueba si cada valor de retorno de la recursividad es el mismo que el booleano de la derecha?

    – Arviman

    6 de enero de 2013 a las 23:32

  • Es un truco fusionar dos declaraciones en una declaración. Esto se debe a que los operadores ternarios permiten solo una declaración por argumento. array_map(...) elimina todos los archivos dentro del directorio, @rmdir(...) elimina el propio directorio.

    – Blaise

    7 de enero de 2013 a las 9:57

  • ¡Ten cuidado! Esta función no comprueba si la ruta realmente existe. Si pasa un argumento vacío, la función comenzará a eliminar archivos desde la raíz. Agregue una verificación de cordura a su ruta antes de ejecutar esta función.

    – Tatu Ulmanen

    24/10/2014 a las 13:34

  • Algunas personas no vieron el comentario de Tatu y lo borraron recursivamente. /así que agregué una versión protegida a mi publicación.

    – Blaise

    26 de noviembre de 2014 a las 10:25

Puedes usar Symfony sistema de archivos (código):

// composer require symfony/filesystem

use Symfony\Component\Filesystem\Filesystem;

(new Filesystem)->remove($dir);

Sin embargo, no pude eliminar algunas estructuras de directorio complejas con este método, por lo que primero debe probarlo para asegurarse de que funciona correctamente.

Podría eliminar dicha estructura de directorios usando una implementación específica de Windows:

$dir = strtr($dir, "https://stackoverflow.com/", '\\');
// quotes are important, otherwise one could
// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');

Y solo por el bien de la exhaustividad, aquí hay un viejo código mío:

function xrmdir($dir) {
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }
        $path = $dir."https://stackoverflow.com/".$item;
        if (is_dir($path)) {
            xrmdir($path);
        } else {
            unlink($path);
        }
    }
    rmdir($dir);
}

  • Muchas gracias. Me ahorras tiempo.

    – zarif khan

    8 de noviembre de 2018 a las 10:44

  • “No reinventar la rueda”. Gracias

    – Kamapluma

    7 de abril de 2020 a las 6:50

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad