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
相关产品推荐
相关产品推荐

