我正在尝试在目录中创建特定文件的数组;这将通过一些测试用例来确保它符合给定的标准。
我正在使用fs.readdir
方法,但它不会返回promise
,这意味着我无法push
到array
。
我的想法是使用我实际想要输出的文件填充数组(arr
),然后对该数组执行某些操作。但由于readdir
是异步的,我无法将.then()
链接到它上面,我的计划被撤销了。
我也尝试用readdirSync
做同样的事情但无济于事。
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
var arr = [];
fs.readdirAsync(folder).then( files => {
files.forEach(file => {
fs.stat(folder + '/' + file, (err, stats) => {
if(!stats.isDirectory()) {
arr.push(file);
return;
}
});
});
})
.then( () => {
console.log(arr);
});
答案 0 :(得分:6)
>>> Finished() != Finished()
True
是基于回调的,所以你可以fs.readdir
使用bluebird(或者自己编写一个简单的实现),或者简单地将调用包装在一个promise中,如下所示:
promisify
或自定义// Wrapped in a promise
new Promise((resolve, reject) => {
return fs.readdir('/folderpath', (err, filenames) => err !== undefined ? reject(err) : resolve(filenames))
})
功能:
promisify
答案 1 :(得分:3)
纯JavaScript,没有库:
function foo (folder, enconding) {
return new Promise(function(resolve, reject) {
fs.readdir(folder,enconding, function(err, filenames){
if (err)
reject(err);
else
resolve(filenames);
});
});
};
例如
foo(someFolder, "someEncoding")
.then((files) => console.log(files))
.catch((error) => console.log(error));
答案 2 :(得分:2)
答案 3 :(得分:2)
我明白了;我只需要使用statSync
代替stat
const fs = require('fs');
var arr = [];
var files = fs.readdirSync(folder);
files.forEach(file => {
let fileStat = fs.statSync(folder + '/' + file).isDirectory();
if(!fileStat) {
arr.push(file);
}
});
console.log(arr);
答案 4 :(得分:1)
您是否尝试过fs-extra模块?
答案 5 :(得分:1)
new Promise((resolve, reject) => {
return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})
不要err !== undefined
,因为错误实际上是null
!
答案 6 :(得分:1)
您现在可以使用 ES6解构分配(documentation)了:
const
fs = require('fs'),
FILES = [...fs.readdirSync('src/myfolder')];
console.log(FILES);
答案 7 :(得分:0)
从Node.js v10开始,有一个fs.promises
API支持此功能:
const fs = require('fs');
var arr = [];
fs.promises.readdir(folder).then( files => {
files.forEach(file => {
fs.stat(folder + '/' + file, (err, stats) => {
if(!stats.isDirectory()) {
arr.push(file);
return;
}
});
});
})
.then( () => {
console.log(arr);
});