16 votes

Trouver le fichier le plus ancien dans un dossier en utilisant PHP

J'ai besoin d'un script PHP qui trouvera la date du fichier le plus ancien dans un dossier. Actuellement, j'itère sur chaque fichier et je compare sa date de modification au fichier précédent et je garde la date la plus ancienne stockée.

Existe-t-il un moyen moins gourmand en disque et en mémoire de faire cela ? Le dossier contient environ 300 000 fichiers. Si j'ouvre le dossier dans l'Explorateur Windows, il sera automatiquement trié par date de modification et je verrai le fichier le plus ancien beaucoup plus rapidement. Existe-t-il un moyen de tirer parti du tri par défaut de l'Explorer à partir d'un script PHP ?

25voto

Anthony Forloney Points 30083
// 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.

Tiré de este site web

Bonne chance

EDIT : Pour exclure les fichiers du répertoire afin de réduire les recherches inutiles :

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

C'est utile si vous savez ce qu'il faut rechercher et ce que vous pouvez exclure.

2voto

Frank Farmer Points 16159

Il y a des inconvénients évidents à cette approche - création d'un processus supplémentaire, dépendance vis-à-vis du système d'exploitation, etc., mais pour 300 000 fichiers, cela peut très bien être plus rapide que d'essayer d'itérer en PHP :

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

Pour info, vous devriez vraiment essayer d'éviter d'avoir 300 000 fichiers dans un seul répertoire. Cela ne fonctionne pas vraiment bien sur la plupart des systèmes de fichiers.

2voto

donquixote Points 318

Une manière plus efficace de faire cela, ici je ne stocke jamais plus d'un nom de fichier en mémoire à la fois :

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

a fonctionné sur un dossier contenant 4000 fichiers et a utilisé 85% de ram en moins que le stockage des noms de fichiers.

1voto

n1c Points 31

Dix mois plus tard, vous n'êtes probablement plus à la recherche d'une solution ici, mais juste au cas où :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X