简体   繁体   English

在fs.stat之前调用fs.access

[英]Calling fs.access before fs.stat

I am trying to list a tree of all my folders on C. Some of the files and folders on c require admin rights and fs.stat throws an error because of this. 我正在尝试列出C上所有文件夹的树。c上的某些文件和文件夹需要管理员权限,因此fs.stat会引发错误。 I would like to somehow check first with fs.access for the rights and if no admin rights are needed to continue with fs.stat. 我想以某种方式先检查fs.access的权限,以及是否不需要管理员权限才能继续使用fs.stat。 All my files and folders are in an array and I'm iterating through it. 我所有的文件和文件夹都在一个数组中,我正在遍历它。 But sadly I don't get it with the callbacks to work. 但是可悲的是,我无法通过回调来实现它。 Can someone help me with this? 有人可以帮我弄这个吗? I appreciate every little help. 感谢您的帮助。

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

    }
});

async call is always problem. 异步调用始终是个问题。 :( :(

anyway, You have two options. 无论如何,您有两个选择。

first use call-back recursive function 首次使用回调递归函数

or 要么

use Promise way. 用承诺的方式。 (recommend blurbird primise) (推荐Blubird Primise)

make some change for res.send and res.end (I tested it for console.) 对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM