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);
});
});
});
});