Javascript列出文件并告诉它们是文件还是目录

时间:2016-06-02 11:15:16

标签: javascript

我正在开发一个javascript文件管理器,我想在主目录中列出我的所有文件,并知道它们是文件还是目录,这里是代码:

var listFiles = function (path) {
    var files = fs.readdirSync(HOME);

    for (var i = 0; i < files.length; i++) {
        var name = HOME + '/' + files[i];

        fs.stat(name.toString(), function (err, fileStat) {
            if(fileStat.isFile()){
                console.log(name.toString() + ' -> FILE');
            }
            else if (fileStat.isDirectory()) {
                console.log(name.toString() + ' -> DIR');
            }
        });
    }
};

var HOME = '/home/user'
var local = listFiles(HOME);

输出是这样的:

/home/user/.xsession-errors.old -> DIR
/home/user/.xsession-errors.old -> FILE
/home/user/.xsession-errors.old -> DIR
/home/user/.xsession-errors.old -> DIR
/home/user/.xsession-errors.old -> FILE
/home/user/.xsession-errors.old -> FILE
/home/user/.xsession-errors.old -> FILE
/home/user/.xsession-errors.old -> DIR
/home/user/.xsession-errors.old -> DIR
/home/user/.xsession-errors.old -> FILE

问题在于我只能

/home/user/.xsession-errors.old -> FILE (or DIR)

作为文件的名称而不是预期的名称(例如:/home/user/file.txt)

1 个答案:

答案 0 :(得分:0)

我认为您的问题是,在调用回调时,name包含最后一个文件的名称。您应该了解变量作用域在JavaScript中的工作原理。

MDN article on closures可能会有所帮助。

这可以做到:

var fs = require('fs');
var path = require('path');

var listFiles = function (basepath) {
    fs.readdirSync(basepath).forEach(function (filename) {
        var fullpath = path.join(basepath, filename);

         fs.stat(fullpath, function (err, fileStat) {
            if (fileStat.isFile()) {
                console.log(filename + ' -> FILE');
            } else if (fileStat.isDirectory()) {
                console.log(filename + ' -> DIR');
            }
        });

    });
};