我正在尝试列出C上所有文件夹的树.c上的某些文件和文件夹需要管理员权限,而fs.stat会因此而抛出错误。我想先用fs.access检查权限,如果不需要管理员权限继续使用fs.stat。我的所有文件和文件夹都在一个数组中,我正在迭代它。但遗憾的是,我不能通过回调来解决问题。有人可以帮我弄这个吗?我很感激每一点帮助。
fs.readdir(seeDir, function (err, files) {
if (err) {
throw err;
};
var fileName = '';
var path = '';
var statCallback;
for (var i = 0; i < files.length; i++) {
fileName = files[i];
path = util.format('%s%s', seeDir, fileName);
var isLast = (i === (files.length - 1));
fs.access(path, fs.F_OK | fs.R_OK, function(err) {
if (err) {
console.log(err);
} else {
fs.stat(path, function (err, stats) {
console.log(path);
if (err) {
throw err;
};
if (stats.isDirectory()) {
res.write(util.format(formatDirectory, path, fileName));
}
if (isLast) {
res.end(stringFooter);
}
});
}
});
}
});
答案 0 :(得分:0)
异步调用始终存在问题。 :(
无论如何,你有两个选择。
首先使用回调递归函数
或
使用Promise方式。 (推荐blurbird primise)
对res.send和res.end进行一些更改(我为控制台测试了它。)
var fs = require('fs');
var util = require('util');
var Promise = require("bluebird");
var formatDirectory = '%s%s';
// CallBack
var getDir = function(seeDir) {
var files = [];
var rv = [];
var done = function() {
console.log(rv);
}
var getFile = function() {
if(files.length == 0) { return done(); } // files empty, recursive done.
var file = files.shift(); // pick first file
var path = util.format('%s%s', seeDir, file);
fs.access(path, fs.F_OK | fs.R_OK, function(err) {
if(err) { console.log(err); getFile(); }
else {
fs.stat(path, function(err, stats) {
if(err) { console.log(err); }
else if(stats.isDirectory()) { rv.push(path); } // push result
getFile(); // recursive call
});
}
});
}
fs.readdir(seeDir, function(err, data) {
if(err) { throw err; }
files = data; // initialize
getFile();
});
}
// Promise
var getDirPromise = function(seeDir) {
fs.readdir(seeDir, function (err, files) {
if (err) { throw err; };
Promise.reduce(files, function(total, file) {
return new Promise(function(resolve, reject) {
var path = util.format('%s%s', seeDir, file);
fs.access(path, fs.F_OK | fs.R_OK, function(err) {
if (err) { console.log(err); return resolve(total); }
else {
return fs.stat(path, function (err, stats) {
console.log(path);
if (err) { console.error(err); }
else if (stats.isDirectory()) {
console.log(util.format(formatDirectory, path, file));
total.push(util.format(formatDirectory, path, file));
}
resolve(total);
});
}
});
});
}, []).then(function(result) {
console.log("done", result);
});
});
}
//getDir('C:/');
//getDirPromise('C:/');