2009-11-23 19 views
14

Ho bisogno di uno script PHP che trovi la data del file più vecchio in una cartella. In questo momento, sto iterando su ogni file e confrontando la sua data modificata al file precedente e mantenendo la data più vecchia memorizzata.Trova il file più vecchio in una cartella utilizzando PHP

C'è un modo meno intenso di memoria/disco per fare questo? Ci sono circa 300k file nella cartella. Se apro la cartella in Windows Explorer, l'ordinamento automatico per data verrà modificato e il file più vecchio verrà visualizzato molto più velocemente. C'è un modo per sfruttare l'ordinamento predefinito di Explorer da uno script PHP?

risposta

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. 

Tratto da this sito

Buona fortuna

EDIT: Per escludere i file nella directory di ridurre le ricerche inutili:

$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]; 

Questo è utile se si sa cosa cercare per e cosa puoi escludere.

+2

Mi piace la risposta, ma con molti file, PHP esaurisce la memoria prima di terminare e lo script muore. – BLAKE

+0

puoi filtrare determinati file per non controllare, forse cartelle, file di testo, script? $ exclude_files = array ('.', '..') –

+1

No, tutti i file sono denominati% timestamp-guid% .tmp. Non riesco a escludere file diversi da "." e '..'. – BLAKE

2

Ci sono alcuni svantaggi evidenti di questo approccio - deposizione delle uova un ulteriore processo, OS-dipendenza, ecc, ma per 300k file, questo può benissimo essere più veloce che cercare di iterare in PHP:

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

FWIW, dovresti davvero cercare di evitare di avere 300.000 file in una sola dir. Questo non funziona molto bene sulla maggior parte dei file system.

+0

Ho provato a farlo, ma ho appena generato un processo cmd.exe e non finisce mai. Anche se il comando che passo ad esso è solo 'exit', il cmd.exe non finirà mai. – BLAKE

1

10 mesi su probabilmente non siete ancora alla ricerca di una soluzione qui, ma solo nel caso in cui:

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

Più memoria modo efficace di fare questo, qui non ho mai memorizzare più di un nome di file in memoria alla volta:

<?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; 

eseguito su una cartella con 4000 file e utilizzato l'85% in meno di ram rispetto alla memorizzazione dei nomi dei file.

Problemi correlati