MST

星途 面试题库

面试题:Node.js 中 fs.readdir 遍历目录结构时如何处理异步操作

在Node.js中,使用fs.readdir遍历目录结构,假设目录下存在子目录且需要递归遍历所有文件和子目录,请描述如何使用异步操作(Promise或async/await)来正确实现这一功能,并写出关键代码片段。
25.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 使用Promise实现
    • 首先,fs.readdir本身是一个异步操作,Node.js提供了基于Promise的版本fs/promises
    • 关键代码如下:
const { readdir, stat } = require('fs/promises');

async function traverseDirectory(dir) {
    const files = await readdir(dir);
    const results = [];
    for (const file of files) {
        const filePath = `${dir}/${file}`;
        const stats = await stat(filePath);
        if (stats.isDirectory()) {
            results.push(...await traverseDirectory(filePath));
        } else {
            results.push(filePath);
        }
    }
    return results;
}

// 调用示例
traverseDirectory('.').then(files => {
    console.log(files);
});
  1. 使用async/await实现
    • 这里实际上和上面基于Promise的实现是类似的,因为async/await是基于Promise的语法糖。
    • 代码如下(和上面基于Promise实现的代码基本一致,只是调用方式上利用了async/await的优势):
const { readdir, stat } = require('fs/promises');

async function traverseDirectory(dir) {
    const files = await readdir(dir);
    const results = [];
    for (const file of files) {
        const filePath = `${dir}/${file}`;
        const stats = await stat(filePath);
        if (stats.isDirectory()) {
            results.push(...await traverseDirectory(filePath));
        } else {
            results.push(filePath);
        }
    }
    return results;
}

async function main() {
    const files = await traverseDirectory('.');
    console.log(files);
}

main();

在上述代码中:

  • traverseDirectory函数接受一个目录路径作为参数。
  • 它首先使用readdir读取目录中的所有文件和子目录。
  • 然后遍历这些条目,使用stat获取每个条目的状态,判断是文件还是目录。
  • 如果是目录,则递归调用traverseDirectory来遍历该子目录;如果是文件,则将其路径添加到结果数组中。
  • 最后返回包含所有文件路径的数组。