簡體   English   中英

如何使用fs或async方法從多個目錄獲取文件?

[英]How to get files from multiple directories using fs or async methods?

我正在嘗試編寫邏輯,以便可以從每個目錄獲取文件信息,如何使用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

此函數將返回目錄內所有文件的文件路徑數組。 它以遞歸方式遍歷指定目錄中的所有文件夾和子文件夾,並忽略空文件夾。

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調用。

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM