Найдите самый старый файл в папке с помощью PHP
Мне нужен PHP-скрипт, который найдет дату самого старого файла в папке. Прямо сейчас я повторяю каждый файл и сравниваю дату его изменения с предыдущим файлом и сохраняю самую старую дату.
Существует ли менее интенсивный способ использования диска/памяти для этого? В папке находится около 300 тысяч файлов. Если я открою папку в проводнике Windows, она автоматически отсортируется по дате изменения, и я увижу самый старый файл намного быстрее. Есть ли какой-нибудь способ, которым я могу воспользоваться Сортировка проводника по умолчанию из PHP-скрипта?
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];
Это полезно, если вы знаете, что искать и что можно исключить.
У этого подхода есть некоторые очевидные недостатки - создание дополнительного процесса, зависимость от операционной системы и т. Д., Но Для файлов объемом 300 тыс. Это вполне может быть быстрее, чем пытаться выполнить итерацию в PHP:
exec('dir /TW /O-D /B', $output);
var_dump($output[0]);
FWIW, вам действительно следует стараться избегать 300 000 файлов в одном каталоге. Это не очень хорошо работает в большинстве файловых систем.
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;
}
Более эффективный способ сделать это с памятью, здесь я никогда не сохраняю в памяти более одного имени файла одновременно:
<?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% меньше оперативной памяти, чем для хранения имен файлов.