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

Node.js fs模块birthtime.getTime()本地正常生产环境失效,如何获取最新文件?

问题原因分析
  • 跨操作系统的文件时间戳行为差异:MacOS 中的 birthtime 准确代表文件的创建时间,但 Linux 系统(多数生产服务器基于此)的 birthtime 实际是文件被创建或复制/移动到当前目录的时间。如果你的生产部署流程会重新构建生成文件,所有文件的 birthtime 会被统一重置为部署时间,导致排序时所有文件时间戳一致,最终返回原数组的第一个元素(表现为字母序排列的第一个)。
修复方案

改用 mtime(文件内容最后修改时间)替代 birthtime,mtime 在跨操作系统中的行为更一致,能准确反映文件内容的实际更新时间。如果业务逻辑必须依赖“创建时间”,但部署流程会重置文件创建时间,也可以考虑在文件上传/生成时将时间信息嵌入文件名(例如 20240520_1430_animation.json),通过解析文件名来排序。

修改后的代码

function getLatestFile() {
  // 获取最近修改的文件
  let latestFile = targetFiles
    .map((file) => ({
      file,
      time: fs
        .statSync(path.join(__dirname, "../public/img/lottie", file))
        .mtime.getTime(), // 替换为mtime
    }))
    .sort((a, b) => b.time - a.time)[0]?.file;

  return latestFile;
}

let theLatestFile = getLatestFile();

额外优化建议

增加错误处理避免程序崩溃:fs.statSync 可能因文件不存在、权限问题抛出错误,建议用 try/catch 包裹处理:

function getLatestFile() {
  let validFiles = targetFiles.map((file) => {
    try {
      const stats = fs.statSync(path.join(__dirname, "../public/img/lottie", file));
      return {
        file,
        time: stats.mtime.getTime(),
      };
    } catch (err) {
      console.error(`无法获取文件信息: ${file}`, err);
      return null;
    }
  }).filter(Boolean); // 过滤掉获取失败的文件

  return validFiles.sort((a, b) => b.time - a.time)[0]?.file;
}

内容的提问来源于stack exchange,提问作者kdub1312

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:38:12