如何使用fs或异步方法从多个目录中获取文件?

时间:2017-03-15 16:24:01

标签: javascript node.js fs async.js

我正在尝试编写逻辑,我可以从每个目录中获取文件信息,如何使用async或任何fs方法实现此目的。我正在将fileInfofilePath传递给函数compareDates以进一步实施。使用下面的代码,我看不到任何结果。

controller.js

var cron = require('cron-job');
var fs = require('fs');
var path = require('path');
var async = require('async');
var directories = ['./logs/dit', './logs/st','./logs/uat']
function cronJob() {
directories.forEach(function(dir){
    var files = fs.readdirSync(dir);
    async.eachSeries(files, function(file, callback) {
            var filePath = path.join(dirPath, file);
            var fileInfo = {};
            fs.stat(filePath, function(err, stats) {
               if (err) {
                 console.info("File doesn't");
                } else {
                 fileInfo.fileDate = stats.birthtime;
                 fileInfo.filename = file;
                 compareDates(fileInfo,filePath);
                 console.log(fileInfo);

               }
            });
        });
})

}

cronJob();

错误

throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs

1 个答案:

答案 0 :(得分:0)

此函数将返回目录中所有文件的文件路径数组。它以递归方式遍历指定目录中的所有文件夹和子文件夹,并忽略空文件夹。

var walk = function(dir, done) {
    var results = [];
    fs.readdir(dir, function(err, list) {
        if (err) return done(err);
        var pending = list.length;
        if (!pending) return done(null, results);
        list.forEach(function(file) {
            file = path.resolve(dir, file);
            fs.stat(file, function(err, stat) {
                if (stat && stat.isDirectory()) {
                    walk(file, function(err, res) {
                        results = results.concat(res);
                        if (!--pending) done(null, results);
                    });
                } else {
                    results.push(file);
                    if (!--pending) done(null, results);
                }
            });
        });
    });
};

用法:

walk(directory, function(err, results) {
    // throw error if something is wrong
    if (err) throw err;

    results.forEach(function(path) {
        // do stuff with the path
    });

});

请注意,该函数将返回相对于/C:\的路径;如果您希望目录相对于server / app.js文件的位置,则需要从每个路径的开头切掉__dirname的长度。

然后,您可以在每个文件上使用fs.stat来获取传递给您的函数所需的信息。

使用您的代码,就像:

var directories = ['/logs/dit', '/logs/st','/logs/uat'];
directories.forEach(function(directory){
    walk(directory, function(listOfFiles) {
        listOfFiles.forEach(function(file) {
            fs.stat(file, function(err, stats) {
                if (err) throw err;
                    var fileDate = stats.birthtime;
                    var filename = file;
                    compareDates(filename, filePath);
            });
        });
    });
});

如果我的代码有点乱,请提前道歉。你可以做的一些事情:

  • 如果您需要保留,请使用for循环代替forEach 文件数量。
  • 重新定位walk并使用在那里进行的fs.stat来电。

希望这会有所帮助:)