本文介绍如何准确识别并重命名目标文件夹中最后修改时间最晚的文件(如将 `file_0202.json` 改为 `file.json`),重点解决 `scandir()` 无法按修改时间排序、路径缺失导致 `rename()` 失败等常见问题。
在 PHP
中,仅依赖 scandir() 按字母顺序降序排列(SCANDIR_SORT_DESCENDING)并不能获取“最新添加/修改”的文件——因为文件名排序(如 file_zzz.json > file_0202.json)与实际时间戳完全无关。此外,原代码中 $selected_file = $files[0] 得到的是不含路径的纯文件名(如 file_0202.json),而 rename() 需要完整源路径和完整目标路径,否则会尝试在当前脚本所在目录下查找该文件,必然失败。
正确的做法是:
以下是优化后的完整示例代码:
filemtime($a);
});
$latestFile = $files[0];
$dirPath = dirname($latestFile);
$filename = basename($latestFile);
// 安全替换:仅匹配文件名中最后一个下划线+非点非下划线字符+点(如 "_0202.")
$newBasename = preg_replace('/_[^_.]*\./', '.', $filename);
$newFilePath = $dirPath . '/' . $newBasename;
// 关键:确保源和目标均为绝对或同级相对路径
if (rename($latestFile, $newFilePath)) {
echo "Renamed successfully: {$filename} → {$newBasename}";
} else {
echo "Failed to rename. Error: " . error_get_last()['message'] ?? 'Unknown error';
}
?>⚠️ 注意事项:
通过以上方法,即可稳定、可靠地实现“重命名最新修改文件”这一典型运维需求。