[英]Calling fs.access before fs.stat
我正在嘗試列出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);
}
});
}
});
}
});
異步調用始終是個問題。 :(
無論如何,您有兩個選擇。
首次使用回調遞歸函數
要么
用承諾的方式。 (推薦Blubird 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:/');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.