异步检查文件夹内容并返回文件路径

时间:2017-09-22 10:38:25

标签: javascript node.js asynchronous

我想在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(字符串)数组,我想检查它们是文件还是文件夹。

请帮忙!

2 个答案:

答案 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();