面试题答案
一键面试- 使用
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);
});
- 使用
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
来遍历该子目录;如果是文件,则将其路径添加到结果数组中。 - 最后返回包含所有文件路径的数组。