在fs.stat之前调用fs.access

时间:2016-05-28 11:52:41

标签: javascript node.js permissions

我正在尝试列出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);
                    }
                });
            }
            });

    }
});

1 个答案:

答案 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:/');
相关问题