entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Eliminar todos los ficheros de una carpeta con PHP

Hola Comunidad, estoy programando en mi página web un pequeño backup que funciona como una mini base de datos para que una parte de mi sitio funcione sin conectarse al MySQL, pero necesito que cuando se introduzca una nueva noticia automáticamente me elimine todos los ficheros dentro de una carpeta en específico.
Tengo este código pero no me funciona:

 $dir = '../gandalf/S'.$data['id'].'/';     
        $handle = opendir($dir);
        $ficherosEliminados = 0;
        while ($file = readdir($handle)) {
            if (is_file($dir.$file)) {
                if (unlink($dir.$file) ){
                    $ficherosEliminados++;
                }
            }
        }
        echo "Eliminados : <strong>". $ficherosEliminados ."</strong>";

3 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Dairón,

tanto tu código como las dos respuestas de arriba son correctas. Una variante a tu código es usar la "nueva" función scandir() en vez de la vieja opendir()

$dir = '../gandalf/S'.$data['id'].'/';     
$files = sandir($dir); // Devuelve un vector con todos los archivos y directorios
$ficherosEliminados = 0;
foreach($files as $f){
   if (is_file($dir.$f)) {
      if (unlink($dir.$file) ){
         $ficherosEliminados++;
       }
    }
}
print "Eliminados : <strong>". $ficherosEliminados ."</strong>";

De cualquiera de estas formas, puede ser que no se borre el archivo: tenés subyacentes los permisos del sistema de archivos del servidor, y por tanto, si el usuario que ejecuta el script PHP no tiene permiso para borrar esos archivos o no tiene permiso para modificar el directorio, los archivos no se podrán borrar.

Esto suele pasar con archivos por ejemplo subidos por FTP y luego intentados borrar por HTTP (la web) y cuando el usuario FTP no es el mismo que el usuario que ejecuta los script, que en algunos servidores es www-data o httpd.

Si son archivos subidos por FTP, fijate que tengan permisos para que puedan ser borrados por otros usuarios y que el directorio pueda ser modificado por otros usuarios.

Saludos!

2votos

GusGarsaky Puntos5480
$files = glob('ruta/al/folder/*'); // obtiene todos los archivos
foreach($files as $file){
  if(is_file($file)) // si se trata de un archivo
    unlink($file); // lo elimina
}

2votos

LxDAndromeda Puntos2440

¿Por qué no usas un bash?:

<?php
   $cmdBorrarDir = "rm -R /UBICACIONDIRECTORIO/";
   shell_exec($cmdBorrarDir);
?>

0voto

dairon comentado

Por ahora utilizaré esta que parece más rápida por ejecutar menos procesos ya que ahora estoy trabajando en localhost, pero cuando lo suba al ftp del server entonces veremos por los problemas de permisos. Saludos y Gracias

0voto

Leonardo-Tadei comentado

Dairón: hacer una llamada a la shell externa para ejecutar un comando consume más recursos y requiere al menos 3 procesos para funcionar (el script, el shell y el comando)... una solución en PHP puro siempre se ejecutará en menos procesos!

0voto

dairon comentado

No lo sabía Leonardo-Tadei aún soy nuevo en esto de la programación web, entonces utilizaré el codigo que tenía antes. Gracias

0voto

Leonardo-Tadei comentado

Esta cuestión no es tanto de programación web, como de la arquitectura de la plataforma LAMP (GNU/Linux, Apache, MySQL y PHP)
Te recomiendo la versión con scandir() que te pongo como respuesta en vez de tu versión original con opendir(): además de ser más simpe su uso, es un opco más eficiente.

Si no tuvieras que borrar todo y tuvieras que borrar basado en un filtro, la versión de @Gus+Garsaky sería la mejor.

0voto

dairon comentado

en Realidad el proceso es mantener las N últimas noticias dentro de la carpeta de su Seccion y cada vez que supere en una eliminar la más vieja de las noticias o eliminarlas todas y crearlas de nuevo ya que tambien mantengo un archivo list_news.jsondb donde guardo los index de las noticas almacenadas en esa carpeta para poder leerlas despues y asi aligerar la conexion a la base de datos, pues en estas carpetas y ficheros guardo solamente las noticias que apareceran en el home y en listar secciones. Que me recomiendas ??

0voto

Leonardo-Tadei comentado

Qué crees otra pergunta para esto, porque mantener un caché manual es algo basatnte diferente a borrar todos los archivos de un directorio...

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta