2009-12-17 23 views
6

¿Cómo se eliminan automáticamente todos los archivos en un subdirectorio después del tiempo x (digamos después de 24 horas)? Sin usar un comando cronjob del servidor o pl. ¿Cómo puede hacer esto simplemente usando código PHP o simplemente visitando la página sin hacer clic en algo y el comando se ejecuta automáticamente.Eliminar automáticamente todos los archivos después del tiempo x

Respuesta

11

de respuesta para el último comentario de mi primera respuesta. Voy a escribir una muestra de código, así que he creado otra respuesta en lugar de agregar un comentario más.

Para eliminar los archivos con extensión personalizada que tiene que poner en práctica código:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

Comentario: 1. En este ejemplo se utiliza la expresión regular /\.txt$/i, lo que significa, que sólo los archivos con extensión txt serán eliminados. El signo '$' significa que el nombre del archivo debe terminar con la cadena '.txt'. La bandera "i" indica que esa comparación será insensible a mayúsculas y minúsculas. Más sobre la función preg_match().

Además, puede utilizar la función strripos() para buscar archivos con cierta extensión. Aquí está el fragmento de código:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filectime($path.'/'.$file)) < 86400) { // 86400 = 60*60*24 
      if (strripos($file, '.txt') !== false) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 

Comentario: En este ejemplo se parece más evidente. El resultado de strripos() también se puede lograr combinando dos funciones: strrpos(strtolower($file), '.txt'), pero, en mi humilde opinión, es una buena regla usar menos funciones en el código para hacerlo más legible y más pequeño. Por favor, lea atentamente la advertencia en la página de la función strripos() (bloque de valores de retorno).

Una notificación más importante: si está utilizando el sistema UNIX, la eliminación de archivos podría fallar debido a los permisos de archivos. Puede consultar el manual sobre la función chmod().

Buena suerte.

+2

En lugar de readdir + preg_match ¿por qué no simplemente usar glob()? –

+0

Tienes razón. No escribí sobre la función glob() simplemente porque nunca la había usado antes. :) Gracias por tu comentario. – Alex

+0

Tomó nota de Alex y Muchísimas gracias – jones

7

Puede usar las funciones básicas de PHP filectime() y unlink() para verificar la hora de creación del archivo y eliminar su archivo/archivos.

EDITAR. Código ejemplo:

if ($handle = opendir('/path/to/files')) { 

    while (false !== ($file = readdir($handle))) { 
     if (filectime($file)< (time()-86400)) { // 86400 = 60*60*24 
      unlink($file); 
     } 
    } 
    } 
+0

Es solo el esqueleto de la función. Puede agregar cualquier condición, p. archivos con extensiones personalizadas o archivos, que coinciden con ciertos patrones, etc. – Alex

+0

gracias alex .... espero que este trabajo ... – jones

+0

De nada. Estoy encantada de ayudarte. Si esta respuesta es apropiada para usted, puede aceptarla haciendo clic en un tic cerca de mi respuesta. – Alex

0

utilizo shell de comandos AT, que es como una tarea programada, aunque

php:

exec("echo rm /somedir/somefile.ext|at now +24 hours"); 
0

Aquí es otro ejemplo que utiliza MUNDIALIZA y se eliminará cualquier archivo

$files = glob('path/to/your/files/*'); 

foreach($files as $file) { // iterate files 
    // if file creation time is more than 5 minutes 
    if ((time() - filectime($file)) > 3600) { // 86400 = 60*60*24 
     unlink($file); 
    } 
} 

o si desea excluir ciertos archivos

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT); 
2

Bueno, aquí vamos, el script PHP que borra los archivos que tienen X días.

<? 
$days = 1; 
$dir = dirname (__FILE__); 

$nofiles = 0; 

    if ($handle = opendir($dir)) { 
    while (($file = readdir($handle)) !== false) { 
     if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
     } 

     if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
     } 
    } 
    closedir($handle); 
    echo "Total files deleted: $nofiles \n"; 
} 
?> 

Ahora pegue este código y guárdelo como un archivo php, cárguelo en la carpeta desde la que desea eliminar los archivos.Se puede ver al principio de este código php

$days = 1; 

que establece el número de días, por ejemplo, si se establece a continuación, 2 archivos mayores de 2 días se eliminarán. Básicamente esto es lo que sucede cuando se ejecuta la secuencia de comandos, se pone el directorio actual y lee las entradas del archivo, se salta '' para el directorio y más controles actuales si hay otros directorios,

if ($file == '.' || $file == '..' || is_dir($dir.'/'.$file)) { 
      continue; 
} 

si la entrada del archivo es no es un directorio entonces se obtiene el tiempo de archivo modificado (hora de última modificación) y lo compara, si es el número de días de edad

if ((time() - filemtime($dir.'/'.$file)) > ($days *86400)) { 
      $nofiles++; 
      unlink($dir.'/'.$file); 
} 

si la condición se convierte en verdad, entonces borra el archivo con la ayuda de unlink() php función. Finalmente cierra el directorio y sale. También agregué un contador para contar la cantidad de archivos que se eliminaron, que se mostrarán al final del proceso de eliminación. Así que coloque el archivo php en el directorio que necesita la eliminación del archivo y ejecútelo.

Esperemos que ayuda :)

0
function deleteCachedData($hours=24) 
{ 
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt'); 
    foreach($files as $file) { 
     if(is_file($file) && (time() - filectime($file)) > $hours*3600) { 
      unlink($file); 
     } 
    } 

}

0

Después de tratar de utilizar estos ejemplos, que conectó un par de cuestiones:

  1. El operador de comparación debe ser mayor que, no menos de
  2. filemtime devuelve la hora modificada. filectime es el momento en que se modifican los datos de inodo de un archivo; es decir, cuando los permisos, propietario, grupo, u otros metadatos de la inode se actualiza, lo que puede conducir a resultados inesperados

He cambiado el ejemplo de usar filemtime y se fija la comparación de la siguiente manera:

<?php 
    $path = dirname(__FILE__).'/files'; 
    if ($handle = opendir($path)) { 

    while (false !== ($file = readdir($handle))) { 
     if ((time()-filemtime($path.'/'.$file)) > 86400) { // 86400 = 60*60*24 
      if (preg_match('/\.txt$/i', $file)) { 
      unlink($path.'/'.$file); 
      } 
     } 
    } 
    } 
?> 
Cuestiones relacionadas