rmdir()
La función rmdir() de PHP elimina directorios. Aprende su sintaxis, parámetros y ejemplos para gestionar el sistema de archivos.
Introducción
En PHP, la función rmdir() se utiliza para eliminar un directorio. Es una función útil para gestionar tu sistema de archivos. En este artículo, cubriremos todo lo que necesitas saber sobre la función rmdir(), incluyendo su sintaxis, parámetros y ejemplos de cómo puede usarse.
Comprender la función rmdir()
La función rmdir() elimina un directorio del sistema de archivos. Hay una regla importante que recordar: rmdir() solo elimina directorios vacíos. Si el directorio aún contiene archivos o subdirectorios, la llamada falla y PHP emite un E_WARNING.
Esto es por diseño: evita que borres un árbol completo con una sola llamada errónea. Para eliminar un directorio que tiene contenido, primero debes eliminar ese contenido (consulta el Ejemplo 2 más abajo).
Otras situaciones que hacen que rmdir() falle y devuelva false:
- La ruta no existe o es un archivo en lugar de un directorio.
- El usuario del script carece de permiso de escritura/ejecución en el directorio padre.
- En algunos sistemas, el directorio es el directorio de trabajo actual del proceso o está en uso.
Funciones relacionadas que usarás frecuentemente junto con rmdir(): mkdir() para crear directorios, is_dir() para comprobar si una ruta es un directorio, scandir() para listar su contenido, y unlink() para eliminar los archivos individuales dentro de él.
Sintaxis de la función rmdir()
rmdir(string $directory, ?resource $context = null): bool| Parámetro | Descripción |
|---|---|
$directory | Requerido. Ruta del directorio a eliminar. |
$context | Opcional. Un recurso de contexto de flujo, usado principalmente con envoltorios de flujo personalizados. Raramente necesario para archivos locales. |
La función devuelve true en caso de éxito y false en caso de fallo.
Nota sobre caché: PHP almacena en caché los resultados de las comprobaciones de estado de archivos. Después de crear o eliminar directorios en un bucle estrecho, llama a
clearstatcache()antes de volver a probar la misma ruta conis_dir()ofile_exists(), de lo contrario podrías leer un resultado desactualizado.
Ejemplos de uso de rmdir()
Ejemplo 1: Eliminar un directorio
Este ejemplo comprueba que la ruta existe con is_dir() antes de intentar eliminarlo, e informa si la llamada tuvo éxito:
<?php
$directory = 'example_directory';
if (is_dir($directory)) {
if (rmdir($directory)) {
echo "Directory removed successfully.";
} else {
echo "Failed to remove directory. It may not be empty or lack permissions.";
}
} else {
echo "Directory does not exist.";
}Si example_directory existe y está vacío, esto imprime Directory removed successfully. Proteger con is_dir() te permite evitar la advertencia que rmdir() emitiría de otro modo para una ruta inexistente.
Ejemplo 2: Eliminar un directorio no vacío
Dado que rmdir() se niega a eliminar un directorio que aún tiene contenido, primero debes vaciarlo. La solución idiomática es un auxiliar recursivo que recorre el árbol, llama a unlink() en cada archivo y recursa en cada subdirectorio antes de llamar finalmente a rmdir() en el directorio ahora vacío:
<?php
function removeDirectory($dir) {
if (!is_dir($dir)) {
return false;
}
$files = array_diff(scandir($dir), ['.', '..']);
foreach ($files as $file) {
$path = $dir . DIRECTORY_SEPARATOR . $file;
is_dir($path) ? removeDirectory($path) : unlink($path);
}
return rmdir($dir);
}
removeDirectory('example_directory');Aquí array_diff(scandir($dir), ['.', '..']) elimina las entradas especiales . y .. devueltas por scandir(), y DIRECTORY_SEPARATOR construye rutas que funcionan tanto en Windows como en sistemas tipo Unix. La función devuelve el resultado del rmdir() final, por lo que puedes comprobarlo para verificar el éxito.
Consejo: La eliminación recursiva es destructiva y no tiene deshacer. Valida la ruta antes de llamarla (por ejemplo, rechaza una cadena vacía o la raíz del sistema de archivos) para que un error no pueda borrar más de lo que pretendías.
Errores comunes y advertencias
- Intentar eliminar un directorio no vacío. Esta es la causa más frecuente de fallo. Vacía el directorio primero, o usa el auxiliar recursivo anterior.
- Ignorar el valor de retorno.
rmdir()devuelvefalseen lugar de lanzar una excepción en la mayoría de los fallos (emite una advertencia). Siempre comprueba el resultado boolean en el código que importa. - Suprimir la advertencia con
@.@rmdir($dir)oculta el mensaje pero no el fallo. Prefiere comprobaris_dir()y el valor de retorno en su lugar. - Olvidar los permisos. Eliminar un directorio requiere permiso de escritura y ejecución en su padre, no en el directorio en sí.
Conclusión
La función rmdir() proporciona una manera sencilla de eliminar directorios vacíos en PHP. Para eliminar un directorio que tiene contenido, vacíalo primero, generalmente con un auxiliar recursivo que combina scandir() y unlink(). Siempre comprueba el valor de retorno, y protege las eliminaciones recursivas destructivas con una comprobación de ruta.
Para profundizar más, explora las funciones de directorio complementarias: mkdir(), is_dir(), scandir() y rename().