在Node.js中获取目录下所有文件名列表的方法

在Node.js中获取目录下所有文件名列表的方法

技术背景

在Node.js开发中,经常需要获取指定目录下的所有文件名称,可能是为了对这些文件进行批量处理、分析等操作。Node.js提供了多种方式来实现这一需求,不同的方法适用于不同的场景。

实现步骤

1. 使用fs.readdirfs.readdirSync方法

fs模块是Node.js的核心模块,无需额外安装。fs.readdir是异步方法,fs.readdirSync是同步方法。

异步方法示例

1
2
3
4
5
6
7
8
9
10
11
12
const testFolder = './tests/';
const fs = require('fs');

fs.readdir(testFolder, (err, files) => {
if (err) {
console.error(err);
return;
}
files.forEach(file => {
console.log(file);
});
});

同步方法示例

1
2
3
4
5
6
7
const testFolder = './tests/';
const fs = require('fs');

const files = fs.readdirSync(testFolder);
files.forEach(file => {
console.log(file);
});

2. 使用glob工具

glob工具可以使用通配符来匹配文件名。首先需要安装glob包:

1
npm install glob

使用示例

1
2
3
4
5
6
7
8
9
10
var glob = require("glob");

// options是可选的
glob("**/*.js", {}, function (er, files) {
if (er) {
console.error(er);
return;
}
console.log(files);
});

3. 递归搜索目录

如果需要递归搜索目录下的所有文件,可以使用以下方法:

递归同步方法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const fs = require('fs');
const path = require('path');

function getFiles(dir, files_){
files_ = files_ || [];
var files = fs.readdirSync(dir);
for (var i in files){
var name = dir + '/' + files[i];
if (fs.statSync(name).isDirectory()){
getFiles(name, files_);
} else {
files_.push(name);
}
}
return files_;
}

console.log(getFiles('path/to/dir'));

递归异步方法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const fs = require('fs');
const path = require('path');

function walk(currentDirPath, callback) {
fs.readdir(currentDirPath, function (err, files) {
if (err) {
callback(err);
return;
}
files.forEach(function (name) {
var filePath = path.join(currentDirPath, name);
fs.stat(filePath, function (err, stat) {
if (err) {
callback(err);
return;
}
if (stat.isFile()) {
callback(null, filePath);
} else if (stat.isDirectory()) {
walk(filePath, callback);
}
});
});
});
}

walk('path/to/root/dir', function(err, filePath) {
if (err) {
console.error(err);
return;
}
console.log(filePath);
});

核心代码

过滤目录只获取文件

1
2
3
4
5
const fs = require('fs');
const path = require('path');

fs.readdirSync('your-directory-path')
.filter((file) => fs.lstatSync(path.join('your-directory-path', file)).isFile());

使用flatMap递归获取文件

1
2
3
4
5
6
7
8
9
function getFiles(dir) {
return fs.readdirSync(dir).flatMap((item) => {
const path = `${dir}/${item}`;
if (fs.statSync(path).isDirectory()) {
return getFiles(path);
}
return path;
});
}

最佳实践

  • 异步操作优先:在处理大量文件或需要高并发的场景下,优先使用异步方法,避免阻塞事件循环。
  • 错误处理:在使用异步方法时,一定要进行错误处理,确保程序的健壮性。
  • 性能优化:如果需要递归搜索目录,尽量使用异步递归方法,以提高性能。

常见问题

1. 同步方法阻塞问题

同步方法会阻塞代码的执行,直到读取操作完成。在高并发场景下,可能会导致性能问题。建议在非关键代码或简单脚本中使用同步方法。

2. 权限问题

如果没有足够的权限访问目录或文件,会抛出错误。在遇到权限问题时,需要检查文件和目录的权限设置。

3. 递归搜索深度问题

递归搜索可能会导致栈溢出错误,特别是在目录结构非常深的情况下。可以考虑使用迭代方法或设置递归深度限制来避免这个问题。


在Node.js中获取目录下所有文件名列表的方法
https://119291.xyz/posts/get-list-of-filenames-in-nodejs-directory/
作者
ww
发布于
2025年5月29日
许可协议