Найти самый старый файл в папке с помощью 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% меньше памяти, чем сохранение имен файлов.