2009-11-23 12 views
14

Necesito un script PHP que encuentre la fecha del archivo más antiguo en una carpeta. En este momento, estoy iterando sobre cada archivo y comparando su fecha de modificación con el archivo anterior y manteniendo la fecha más antigua almacenada.Buscar el archivo más antiguo en una carpeta usando PHP

¿Hay una forma de hacer menos uso de disco/memoria para hacer esto? Hay aproximadamente 300k archivos en la carpeta. Si abro la carpeta en el Explorador de Windows, se ordenará automáticamente por fecha de modificación y veo que el archivo más antiguo es mucho más rápido. ¿Hay alguna manera de que pueda aprovechar la clasificación predeterminada de Explorer desde un script PHP?

Respuesta

20
// Grab all files from the desired folder 
$files = glob('./test/*.*'); 

// Sort files by modified time, latest to earliest 
// Use SORT_ASC in place of SORT_DESC for earliest to latest 
array_multisort(
array_map('filemtime', $files), 
SORT_NUMERIC, 
SORT_ASC, 
$files 
); 

echo $files[0] // the latest modified file should be the first. 

Tomado de this página web

Buena suerte

EDIT: Para excluir archivos en el directorio de reducir búsquedas innecesarias:

$files = glob('./test/*.*'); 
$exclude_files = array('.', '..'); 
if (!in_array($files, $exclude_files)) { 
// Sort files by modified time, latest to earliest 
// Use SORT_ASC in place of SORT_DESC for earliest to latest 
array_multisort(
array_map('filemtime', $files), 
SORT_NUMERIC, 
SORT_ASC, 
$files 
); 
} 

echo $files[0]; 

Esto es útil si usted sabe qué buscar por y lo que puedes excluir.

+2

Me gusta su respuesta, pero con tantos archivos, PHP se queda sin memoria antes de terminar y el script muere. – BLAKE

+0

¿Puedes filtrar ciertos archivos para que no se comprueben, tal vez carpetas, archivos de texto, scripts? $ exclude_files = array ('.', '..') –

+1

No, todos los archivos se llaman% timestamp-guid% .tmp. No puedo excluir ningún archivo que no sea '.' y '..'. – BLAKE

2

Hay algunas desventajas obvias a este enfoque - desove un proceso adicional, OS-dependencia, etc., pero para 300k archivos, esto puede muy bien ser más rápido que tratar de repetir en PHP:

exec('dir /TW /O-D /B', $output); 
var_dump($output[0]); 

FWIW, realmente debería tratar de evitar tener 300,000 archivos en un solo directorio. Eso realmente no funciona bien en la mayoría de los sistemas de archivos.

+0

He intentado hacer esto, pero solo genera un proceso cmd.exe y nunca termina. Incluso si el comando que paso a él es solo 'exit', el cmd.exe nunca terminará. – BLAKE

1

10 meses probablemente no está todavía en busca de una solución a este problema, pero por si acaso:

function findOldestFile($directory) { 
    if ($handle = opendir($directory)) { 
     while (false !== ($file = readdir($handle))) { 
      $files[] = $file; 
     } 

     print_r("\n"); 
     print_r($files); 
     print_r("\n"); 


     foreach ($files as $file) { 
      if (is_file($directory.'/'.$file)) { 
       $file_date[$file] = filemtime($directory.'/'.$file); 
      } 
     } 
    } 

    closedir($handle); 
    asort($file_date, SORT_NUMERIC); 
    reset($file_date); 
    $oldest = key($file_date); 
    return $oldest; 
} 
1

más memoria forma eficaz de hacer esto, aquí nunca almacenar más de un nombre de archivo en la memoria a la vez:

<?php 
$directory= "C:\\"; 

$smallest_time=INF; 

$oldest_file=''; 

if ($handle = opendir($directory)) { 

    while (false !== ($file = readdir($handle))) { 

     $time=filemtime($directory.'/'.$file); 

     if (is_file($directory.'/'.$file)) { 

      if ($time < $smallest_time) { 
       $oldest_file = $file; 
       $smallest_time = $time; 
      } 
     } 
    } 
    closedir($handle); 
} 



echo $oldest_file; 

funcionó en una carpeta con 4000 archivos y utilizó un 85% menos de memoria RAM que el almacenamiento de los nombres de los archivos.

Cuestiones relacionadas