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

Javascript 如何使用fs或异步方法从多个目录获取文件?,javascript,node.js,fs,async.js,Javascript,Node.js,Fs,Async.js,我正在尝试编写逻辑,从每个目录中获取文件信息,如何使用async或任何fs方法实现这一点。我正在将fileInfo和filePath传递给函数compareDates,以便进一步实现。使用下面的代码,我看不到任何结果 controller.js var cron = require('cron-job'); var fs = require('fs'); var path = require('path'); var async = require('async'); var directori

我正在尝试编写逻辑,从每个目录中获取文件信息,如何使用
async
或任何
fs
方法实现这一点。我正在将
fileInfo
filePath
传递给函数
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();
错误


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

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:\
的路径;如果希望目录与服务器/app.js文件的位置相对,则需要从每个路径的开头切掉
\uu 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
    调用

希望这有帮助:)

我在cronJob(C:\Users的Array.forEach(native)上遇到错误
,你能粘贴错误堆栈吗?如果你在linux以外的操作系统(即windows)上运行,
var filename=file
(假设您复制并粘贴了代码)`ReferenceError:walk未在C:\Users\sh529u\webstorprojects\Ulog-0\Ulog\app\serverfiles\cronJobs.js:10:6 at Array.forEach(native)at C:\Users\sh529u\webstorprojects\Ulog-0\Ulog\app\serverfiles\cronJobs.js:9:14 at Array.forEach(native)at cronJob(C:\Users\sh529u\webstorprojects\Ulog-0\Ulog\app\serverfiles\cro nJobs.js:7:13)在对象上。(C:\Users\sh529u\webstorprojects\Ulog-0\Ulog\app\serv-files\cronJobs.js:42:1)`我修正了
filename
period您必须定义walk函数的问题。复制walk函数并将其粘贴到
cron
函数上方。此外,您还应该对堆栈使用backticks``````。有助于提高可读性:)实际的错误消息是什么?那一行代码是在哪里找到的?我在控制台调用
var files=fs.readdirSync(dir);
时看到这个错误,这很奇怪。你确定你没有使用
fs.readdir
?不,我没有,有更好的方法来完成这个任务吗
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);
            });
        });
    });
});