2010-05-27 7 views
1

Je cherche du code qui répertorie récursivement les cinq fichiers les plus récents dans un répertoire.Récupérer récursivement les fichiers les plus récents avec PHP

C'est un code non récurrent, et serait parfait pour moi si elle était récursive:

<?php 

$show = 0; // Leave as 0 for all 
$dir = 'sat/'; // Leave as blank for current 

if($dir) chdir($dir); 
$files = glob('*.{html,php,php4,txt}', GLOB_BRACE); 
usort($files, 'filemtime_compare'); 

function filemtime_compare($a, $b) 
{ 
    return filemtime($b) - filemtime($a); 
} 
$i = 0; 
foreach ($files as $file) 
{ 
    ++$i; 
    if ($i == $show) break; 
    echo $file . ' - ' . date('D, d M y H:i:s', filemtime($file)) . '<br />' . "\n"; /* This is the output line */ 
} 
?> 

Il est possible de le modifier pour analyser des répertoires récursive?

+1

Que voulez-vous dire récursivement? Vous voulez lister les cinq fichiers les plus récemment touchés dans un répertoire donné et dans tous ses sous-répertoires? – Dereleased

+0

Oui, oui! "liste les cinq fichiers les plus récemment touchés dans un répertoire donné et tous ses sous-répertoires" – Peter

Répondre

1

C'est assez rapide et sale, et non testé, mais peut commencer:

function top5mods($dir) 
{ 
    $mods = array(); 
    foreach (glob($dir . '/*') as $f) { 
    $mods[] = filemtime($f); 
    } 
    sort($mods); 
    $mods = array_reverse($mods); 
    return array_slice($mods, 0, 5); 
} 
+0

'glob' n'est pas récursif. –

2

Ce fut ma première version (testé, travail):

function latest($searchDir, array $files = array()) { 
    $search = opendir($searchDir); 

    $dirs = array(); 
    while($item = readdir($search)) { 
     if ($item == '.' || $item == '..') { continue; } 
     if (is_dir($searchDir.'/'.$item)) { 
      $dirs[] = $searchDir.'/'.$item; 
     } 
     if (is_file($searchDir.'/'.$item)) { 
      $ftime = filemtime($searchDir.'/'.$item); 
      $files[$ftime] = $searchDir.'/'.$item; 
     } 
    } 
    closedir($search); 
    if (count($dirs) > 0) { 
     foreach ($dirs as $dir) { 
      $files += latest($dir,$files); 
     } 
    } 
    krsort($files); 
    $files = array_slice($files, 0, 5, true); 
    return $files; 
} 

Mais j'aime l'utilisation de l'octet de glob(), est donc ici une version légèrement modifiée de son retourner le même format:

function top5modsEx($dir) { 
    $mods = array(); 
    foreach (glob($dir . '/*') as $f) { 
     $mods[filemtime($f)] = $f; 
    } 
    krsort($mods); 
    return array_slice($mods, 0, 5, true); 
} 

Cela renvoie l'heure (format UNIX Timestamp) que le fichier a été modifié en tant que clé de l'élément dans le tableau.

+0

Travailler comme un charme! Est-il possible d'exclure des fichiers de la recherche? – Peter

+0

|| $ item == 'exclure ceci' --- ceci est la solution. Merci encore beaucoup! – Peter

Questions connexes