2017-09-22 4 views
0

ノードにスクリプトを書き込んで、指定された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を使用して、私は(.then()用法)非同期メソッドとしてそれを使用できるようにfs.lstatを使用したい:私の知る限りは、適切な機能を開発することができたとして

pathArr引数は、ファイルまたはフォルダであるかどうかを確認するURL(文字列)の配列です。

助けてください!あなたがasync.series、async.map、async.eachのいずれかを使用することができますどのようにこの程度

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

。どちらはパラメータを配列として取ります。以下の例は、合計ファイルサイズを非同期に計算する例です。

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(); 
+1

これはほとんど私が探していたものです。唯一の違いは、 'fileStat'メソッドは、フィルタメソッドのようなurls自体ではなく、真偽の文を返しますが、私はそれを自分で処理すると思います! – mrmnmly

+0

うれしい;) –

2

関連する問題