You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现含动态日期的文件名添加连续递增序号问题咨询

解决方案

你现有代码的序号生成逻辑和当前时间绑定,每次运行时生成的文件名前缀带当前时间,同时直接用源文件目录的文件总数作为序号基数,没有读取历史已生成文件的最大序号,所以日期/时间变化后序号就会重置为1。

实现思路

  • 遍历存储最终READY文件的目标目录,筛选所有前缀为GRPROMO_0000_、后缀为.READY的历史文件
  • 从所有匹配的文件名中提取末尾的序号段,计算得到历史最大序号
  • 新文件序号为最大序号+1,按需补前导零后,和当前时间拼接生成最终文件名

修正后代码

<?php
$file = '/var/www/html/stock/BRNCH0.csv'; // 源文件
$newfile = '/var/www/html/stock/csvs/BRNCH0.csv'; // 临时复制路径
$targetDir = '/var/www/html/stock/csc/'; // 最终文件存储目录
$date = new DateTime();
$ext = '.READY'; // 文件后缀

// 第一步:复制源文件
if(!copy($file, $newfile)){
    echo "failed to copy $file";
    exit;
}
echo "copied $file into $newfile\n";

// 第二步:计算历史最大序号
$maxSeq = 0;
// 遍历目标目录匹配规则的文件
foreach (glob($targetDir . "GRPROMO_0000_*.READY") as $historyFile) {
    // 提取文件名部分,去掉路径和后缀
    $fileName = basename($historyFile, $ext);
    // 按_和-分割,取最后一段就是序号
    $parts = preg_split('/[_-]/', $fileName);
    $seq = end($parts);
    if (is_numeric($seq) && $seq > $maxSeq) {
        $maxSeq = (int)$seq;
    }
}
// 新序号=最大序号+1,补2位前导零,需要3位就改成%03d
$newSeq = sprintf('%02d', $maxSeq + 1);

// 第三步:生成最终文件名并重命名
$finalName = "GRPROMO_0000_" . $date->format('Ymd-His') . "-" . $newSeq . $ext;
rename($newfile, $targetDir . $finalName);
echo "文件已生成:" . $finalName;
?>

注意事项

  • 如果你需要序号是3位(比如你示例里的145),把sprintf('%02d', $maxSeq + 1)改成sprintf('%03d', $maxSeq + 1)即可
  • 逻辑不绑定日期时间,不管时间怎么变,都会读取所有历史文件的最大序号自动递增,不会出现序号重置为1的问题
  • 首次运行时目录里没有历史文件,序号会从01(或者001,看你设置的位数)开始生成

内容的提问来源于stack exchange,提问作者Francois van Ellinckhuyzen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:15:02