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

Node.js如何在fs.stat方法外部获取文件创建时间并存入数组返回

嘿,这是Node.js异步操作的经典问题!你遇到的情况,核心原因是fs.stat是异步方法——它不会阻塞代码执行,而是先去后台读取文件状态,等读取完成后才会调用传入的回调函数。而你写在回调外面的console.log,会在回调函数执行之前就运行了,这时候createdDate还没被赋值,自然就是undefined。

下面给你几种靠谱的解决方法,你可以根据场景选择:

1. 用回调函数传递结果

把需要处理创建时间的逻辑放到一个单独的函数里,在fs.stat的回调中调用这个函数并把时间传进去:

// 定义处理创建时间的函数
function processCreatedDate(createdDate) {
  console.log(createdDate); // 这里能拿到正确的时间
  // 在这里把时间存入数组或者做其他你需要的操作
}

fs.stat('./templates/' + file, function(err, stats) {
  // 别忘了处理错误
  if (err) {
    console.error('读取文件状态失败:', err);
    return;
  }
  const createdDate = stats.birthtime;
  processCreatedDate(createdDate);
});

2. 用Promise + async/await(推荐,代码更清晰)

Node.js的fs模块已经有Promise版本了,用async/await可以让异步代码看起来像同步代码一样好读:

const fs = require('fs').promises; // 引入Promise版的fs模块

// 封装一个获取文件创建时间的异步函数
async function getFileCreationTime(filePath) {
  try {
    const stats = await fs.stat(filePath);
    return stats.birthtime;
  } catch (err) {
    console.error('读取文件状态出错:', err);
    throw err; // 可以把错误抛出去让调用者处理
  }
}

// 调用这个函数
async function main() {
  const createdDate = await getFileCreationTime('./templates/' + file);
  console.log(createdDate); // 这里能直接拿到时间
  // 把时间存入数组的操作放在这里就行
}

main();

如果要处理多个文件,把它们的创建时间都存入数组,可以用Promise.all来并行处理:

const fs = require('fs').promises;
const fileList = ['file1.html', 'file2.txt', 'file3.md']; // 你的文件列表

async function getAllCreationDates() {
  // 用Promise.all并行处理所有文件
  const dateArray = await Promise.all(
    fileList.map(file => fs.stat('./templates/' + file).then(stats => stats.birthtime))
  );
  return dateArray;
}

// 调用后就能拿到存满创建时间的数组
getAllCreationDates()
  .then(dates => console.log('所有文件的创建时间:', dates))
  .catch(err => console.error('处理出错:', err));

3. 用同步方法fs.statSync(适合简单脚本,注意阻塞问题)

如果你的场景是简单脚本,不需要考虑性能阻塞的问题,可以直接用同步版本的fs.statSync,它会阻塞代码直到读取完成,这样就能直接拿到值:

try {
  const stats = fs.statSync('./templates/' + file);
  const createdDate = stats.birthtime;
  console.log(createdDate); // 直接就能拿到正确时间
  // 存入数组的操作也直接在这里做
} catch (err) {
  console.error('读取文件状态失败:', err);
}

注意:同步方法会阻塞主线程,如果是服务器这类需要高并发的场景,尽量用异步的方式哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:06