[英]How to get files from multiple directories using fs or async methods?
我正在嘗試編寫邏輯,以便可以從每個目錄獲取文件信息,如何使用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();
錯誤
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.