簡體   English   中英

在fs.stat之前調用fs.access

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM