我正在尝试使用 Node.js 获取目录中存在的所有文件的名称列表。我想要一个文件名数组的输出。我怎样才能做到这一点?
如何获取 Node.js 目录中所有文件的名称列表?
IT技术
javascript
node.js
directory-listing
2021-02-01 19:18:10
6个回答
您可以使用fs.readdir
或fs.readdirSync
方法。fs
包含在 Node.js 核心中,因此无需安装任何东西。
文件读取目录
const testFolder = './tests/';
const fs = require('fs');
fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
console.log(file);
});
});
fs.readdir同步
const testFolder = './tests/';
const fs = require('fs');
fs.readdirSync(testFolder).forEach(file => {
console.log(file);
});
这两种方法的区别在于,第一种是异步的,因此您必须提供一个回调函数,该函数将在读取过程结束时执行。
第二个是同步的,它将返回文件名数组,但它将停止任何进一步的代码执行,直到读取过程结束。
IMO 执行此类任务的最便捷方法是使用glob工具。这是node.js的glob 包。安装
npm install glob
然后使用通配符匹配文件名(示例取自包的网站)
var glob = require("glob")
// options is optional
glob("**/*.js", options, function (er, files) {
// files is an array of filenames.
// If the `nonull` option is set, and nothing
// was found, then files is ["**/*.js"]
// er is an error object or null.
})
如果您打算使用globby,这里是一个示例,用于查找当前文件夹下的任何 xml 文件
var globby = require('globby');
const paths = await globby("**/*.xml");
不过,上面的答案并未对目录执行递归搜索。这是我为递归搜索所做的(使用node-walk : npm install walk
)
var walk = require('walk');
var files = [];
// Walker options
var walker = walk.walk('./test', { followLinks: false });
walker.on('file', function(root, stat, next) {
// Add this file to the list of files
files.push(root + '/' + stat.name);
next();
});
walker.on('end', function() {
console.log(files);
});
获取所有子目录中的文件
const fs=require('fs');
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'))
这是一个仅使用本机fs
和path
module的简单解决方案:
// sync version
function walkSync(currentDirPath, callback) {
var fs = require('fs'),
path = require('path');
fs.readdirSync(currentDirPath).forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walkSync(filePath, callback);
}
});
}
或异步版本(fs.readdir
改为使用):
// async version with basic error handling
function walk(currentDirPath, callback) {
var fs = require('fs'),
path = require('path');
fs.readdir(currentDirPath, function (err, files) {
if (err) {
throw new Error(err);
}
files.forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walk(filePath, callback);
}
});
});
}
然后你只需调用(同步版本):
walkSync('path/to/root/dir', function(filePath, stat) {
// do something with "filePath"...
});
或异步版本:
walk('path/to/root/dir', function(filePath, stat) {
// do something with "filePath"...
});
不同之处在于节点在执行 IO 时如何阻塞。鉴于上面的 API 是相同的,您可以只使用异步版本来确保最佳性能。
但是,使用同步版本有一个优势。一旦遍历完成,就更容易执行一些代码,就像遍历之后的下一条语句一样。使用异步版本,您需要一些额外的方式来知道何时完成。也许首先创建所有路径的地图,然后枚举它们。对于简单的构建/实用程序脚本(与高性能 Web 服务器相比),您可以使用同步版本而不会造成任何损坏。
其它你可能感兴趣的问题