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


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

Существует ли менее интенсивный способ использования диска/памяти для этого? В папке находится около 300 тысяч файлов. Если я открою папку в проводнике Windows, она автоматически отсортируется по дате изменения, и я увижу самый старый файл намного быстрее. Есть ли какой-нибудь способ, которым я могу воспользоваться Сортировка проводника по умолчанию из PHP-скрипта?

Author: halfer, 2009-11-23

4 answers

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

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

Удачи

ИЗМЕНИТЬ: Чтобы исключить файлы из каталога, чтобы сократить ненужные поиски:

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

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

 20
Author: Anthony Forloney, 2009-11-23 19:56:37

У этого подхода есть некоторые очевидные недостатки - создание дополнительного процесса, зависимость от операционной системы и т. Д., Но Для файлов объемом 300 тыс. Это вполне может быть быстрее, чем пытаться выполнить итерацию в PHP:

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

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

 2
Author: Frank Farmer, 2009-11-23 18:40:03

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;
}
 1
Author: n1c, 2010-09-23 15:41:22

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

 <?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% меньше оперативной памяти, чем для хранения имен файлов.

 1
Author: donquixote, 2015-07-20 20:14:06