我想在Node中编写一个脚本,它会检查给定的url数组中是否有文件,然后检索它。我想让它异步。
至于我能够发展出适当的功能:
const fs = require('fs-extra');
function getFiles(pathArr = []) {
return new Promise((resolve, reject) => {
let filesArr = pathArr.filter(obj => {
return fs.lstatSync(obj, (err, stat) => {
if (err) {
return false;
}
return stat.isFile();
});
});
resolve(filesArr);
});
}
但它使用fs.lstatSync
,我想使用fs.lstat
将其用作异步方法(使用.then()
)。 pathArr
参数是一个urls(字符串)数组,我想检查它们是文件还是文件夹。
请帮忙!
答案 0 :(得分:1)
这个怎么样
const fs = require('fs-extra');
function getFiles(pathArr = []) {
var promises = [];
return new Promise((resolve, reject) => {
let filesArr = pathArr.filter(obj => {
promises.push(fileStat(obj));
});
Promise.all(promises).then(function (result) {
resolve(result);
});
});
}
function fileStat(obj) {
return new Promise((resolve, reject) => {
return fs.lstat(obj, (err, stat) => {
if (err) {
reject(err);
}
resolve(stat.isFile())
});
});
}
答案 1 :(得分:1)
您可以使用async.series,async.map,async.each中的任何一个。这将数组作为参数。请参阅下面的示例,它以异步方式计算总文件大小。
let fs = require("fs");
let async = require('async');
let paths = ['./demo1.txt', './demo2.txt', './demo3.txt'];
let totalSize = 0;
let calcSize = function () {
async.each(paths, function iterator(path, next) {
let fileName = path.split("/");
fs.stat(path, function (err, stat) {
totalSize += stat.size;
next(null);
});
},function(){ console.log("totalSize : "+totalSize)})
}
calcSize();