使用fs.statSync()和fs.readdir()获取目录列表

时间:2015-09-29 18:44:07

标签: node.js fs

我想我会在创建自定义http服务器的过程中与其他任何人一起分享这个简单的提示。

我试图使用fs.stat()来解析fs.readdir()的结果,识别目录和文件,并将两者分成排序数组以供显示。

不幸的是,因为fs.stat()是异步的,有时它会在数组完成填充并在res.end()中写出之前达到res.write(),并且程序会出错。

所以我尝试使用fs.statSync作为替代品,并认为它会强制所有其他处理等待它完成:

...
var filesSorted = [];
var dirsSorted = [];

//The "files" variable comes from fs.readdir(), and "url" is
//the path to the directory.
files.forEach(function(file) {
    var fileObj = url + file;
    fs.statSync(fileObj, function(err, stats) {
        if(stats.isDirectory) {
            dirsSorted.push({
                "dirname" : file,
                "creation" : stats['birthtime']
            });
        } else {
            filesSorted.push({
                "filename" : file,
                "size" : stats['size'],
                "creation" : stats['birthtime']
            });
        }
    });
});
...

不幸的是,这不起作用。你不能以这种方式放弃fs.statSync()。我认为(但不确定)是因为它在其他没有它的异步命令中运行。在res.end()甚至完成将值推送到数组之前,它始终达到fs.statSync()

1 个答案:

答案 0 :(得分:0)

经过一段时间的努力,我决定采用不同的方法。我试图将var filesSorted的输出分配给其父函数内的变量,而不是试图从var dirsSorted内部推送到fs.statSync()fs.statSync()。在fs.statSync()完成之前,父函数将无法完成:

var filesSorted = [];
var dirsSorted = [];

files.forEach(function(file) {
    var fileObj = url + file;
    stats = fs.lstatSync(fileObj);
    if(stats.isDirectory()) {
        dirsSorted.push({
            "dirname" : file,
            "creation" : stats['birthtime']
        });
    } else {
        filesSorted.push({
            "filename" : file,
            "size" : stats['size'],
            "creation" : stats['birthtime']
        });
    }
});

那很有效!对于需要在异步函数内进行同步调用的其他情况,它似乎是有效的。

我希望其他人觉得这很有帮助。