我需要一个PHP脚本来查找文件夹中最旧文件的日期。现在,我正在迭代每个文件,并将它的Date Modified与前一个文件进行比较,并保存最早的日期。
是否有更少的磁盘/内存密集型方法来执行此操作?文件夹中有大约300k文件。如果我在Windows资源管理器中打开该文件夹,它将按修改日期自动排序,我会更快地看到最旧的文件。有什么方法可以利用PHP脚本中的Explorer默认排序吗?
答案 0 :(得分:24)
// 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.
取自this网站
祝你好运编辑:要排除目录中的文件以减少不必要的搜索:
$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];
如果您知道要查找的内容以及可以排除的内容,这将非常有用。
答案 1 :(得分:2)
这种方法有一些明显的缺点 - 产生额外的进程,操作系统依赖性等,但对于300k文件,这可能比尝试在PHP中迭代更快:
exec('dir /TW /O-D /B', $output);
var_dump($output[0]);
FWIW,你应该尽量避免在一个目录中拥有300,000个文件。这在大多数文件系统上并不是很好。
答案 2 :(得分:1)
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;
}
答案 3 :(得分:1)
更有效的内存方式,这里我一次不会在内存中存储多个文件名:
<?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%的ram。