2009-11-23 12 views
14

Ich brauche ein PHP-Skript, das das Datum der ältesten Datei in einem Ordner findet. Im Moment überspiele ich jede Datei und vergleiche ihr Datum mit der vorherigen Datei und halte das älteste Datum gespeichert.Finden älteste Datei in einem Ordner mit PHP

Gibt es eine weniger Festplatte/Speicher intensive Möglichkeit, dies zu tun? Im Ordner befinden sich etwa 300.000 Dateien. Wenn ich den Ordner im Windows Explorer öffne, wird automatisch nach Datum sortiert und ich sehe die älteste Datei viel schneller. Gibt es irgendeine Möglichkeit, die Standardsortierung des Explorers aus einem PHP-Skript zu nutzen?

Antwort

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. 

Entnommen this Webseite

Viel Glück

EDIT: Um Dateien im Verzeichnis ausschließen, um unnötige Suche einzuschränken:

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

Dies ist hilfreich, wenn Sie wissen, was zu suchen für und was Sie ausschließen können.

+2

Ich mag Ihre Antwort, aber mit so vielen Dateien, läuft PHP aus dem Speicher vor dem Beenden und das Skript stirbt. – BLAKE

+0

können Sie bestimmte Dateien ausfiltern, um sie nicht zu überprüfen, vielleicht Ordner, Textdateien, Skripte? $ exclude_files = array ('.', '..') –

+1

Nein, alle Dateien heißen% timestamp-guid% .tmp. Ich kann keine anderen Dateien als '.' und '..'. – BLAKE

2

einige offensichtliche Nachteile dieses Ansatzes sind - Laichen einen zusätzlichen Prozess, OS-Abhängigkeit, etc., aber für 300k-Dateien, das sehr gut schneller sein kann als der Versuch, in PHP iterieren:

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

FWIW, Sie sollten wirklich versuchen, 300.000 Dateien in einem einzigen Verzeichnis zu vermeiden. Das funktioniert auf den meisten Dateisystemen nicht wirklich gut.

+0

Ich habe versucht, dies zu tun, aber ich spawns nur einen cmd.exe Prozess und endet nie. Selbst wenn der Befehl, den ich ihm gebe, nur "exit" ist, wird die cmd.exe nie enden. – BLAKE

1

10 Monate sind Sie wahrscheinlich noch nicht nach einer Lösung suchen hier, aber nur für den Fall:

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

Mehr Speicher effizienter Weg, dies zu tun, hier habe ich nie Namen mehr als eine Datei im Speicher ablegen zu einer Zeit:

lief auf einem Ordner mit 4000 Dateien und 85% weniger RAM als Speichern der Dateinamen verwendet.

Verwandte Themen