Найти самый старый файл в папке с помощью PHP

Мне нужен PHP script, который найдет дату самого старого файла в папке. Прямо сейчас, я повторяю каждый файл и сравниваю его Date Modified с предыдущим файлом и сохраняю самую старую дату.

Есть ли меньше возможностей для работы с дисками/памятью? В папке содержится около 300 тыс. Файлов. Если я открою папку в Проводнике Windows, она будет автоматически сортироваться по дате, и я увижу самый старый файл намного быстрее. Есть ли способ, которым я могу использовать сортировку по умолчанию Explorer из PHP script?

Ответы

Ответ 1

// 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.

Взято из этот веб-сайт

Удачи.

EDIT: Чтобы исключить файлы в каталоге, чтобы уменьшить ненужные запросы:

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

Это полезно, если вы знаете, что искать и чего вы можете исключить.

Ответ 2

Есть некоторые очевидные недостатки в этом подходе - создание дополнительного процесса, зависимость от ОС и т.д., но для файлов 300 КБ это может быть намного быстрее, чем пытаться выполнить итерацию в PHP:

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

FWIW, вы действительно должны стараться не иметь 300 000 файлов в одном каталоге. Это не очень хорошо работает на большинстве файловых систем.

Ответ 3

Через 10 месяцев вы, вероятно, еще не ищете решение здесь, но на всякий случай:

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

Ответ 4

Больше памяти эффективный способ сделать это, здесь я никогда не храню больше одного имени файла в памяти за раз:

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

работал в папке с 4000 файлами и использовал на 85% меньше памяти, чем сохранение имен файлов.