node.js fs.readdir递归目录搜索

关于使用fs.readdir进行异步目录搜索的任何想法?我意识到我们可以引入递归并使用下一个目录来调用read目录函数以进行读取,但是我有点担心它不会异步...

有任何想法吗?我看过很棒的node-walk,但不像readdir那样仅给我数组中的文件。虽然

寻找像...的输出

['file1.txt', 'file2.txt', 'dir/file3.txt']
西门泡芙Jim2020/03/20 10:33:45

这是一种获取所有文件(包括子目录)的递归方法。

const FileSystem = require("fs");
const Path = require("path");

//...

function getFiles(directory) {
    directory = Path.normalize(directory);
    let files = FileSystem.readdirSync(directory).map((file) => directory + Path.sep + file);

    files.forEach((file, index) => {
        if (FileSystem.statSync(file).isDirectory()) {
            Array.prototype.splice.apply(files, [index, 1].concat(getFiles(file)));
        }
    });

    return files;
}
JinJin卡卡西小胖2020/03/20 10:33:44

递归READDIR模块具有此功能。

卡卡西Near2020/03/20 10:33:44

klawklaw-sync对于这种事情值得考虑。这些是node-fs-extra的一部分

Gil番长2020/03/20 10:33:44

我喜欢的答案,从chjj以上,并且不会已经能够没有这种开始创建我的版本并行循环的。

var fs = require("fs");

var tree = function(dir, done) {
  var results = {
        "path": dir
        ,"children": []
      };
  fs.readdir(dir, function(err, list) {
    if (err) { return done(err); }
    var pending = list.length;
    if (!pending) { return done(null, results); }
    list.forEach(function(file) {
      fs.stat(dir + '/' + file, function(err, stat) {
        if (stat && stat.isDirectory()) {
          tree(dir + '/' + file, function(err, res) {
            results.children.push(res);
            if (!--pending){ done(null, results); }
          });
        } else {
          results.children.push({"path": dir + "/" + file});
          if (!--pending) { done(null, results); }
        }
      });
    });
  });
};

module.exports = tree;

我也创建了一个Gist欢迎发表评论。我仍是从NodeJS领域开始的,所以这是我希望学习更多的一种方法。

老丝达蒙2020/03/20 10:33:44

如果您想使用npm套件,扳手非常好。

var wrench = require("wrench");

var files = wrench.readdirSyncRecursive("directory");

wrench.readdirRecursive("directory", function (error, files) {
    // live your dreams
});

编辑(2018):
最近阅读过的任何人:作者于2015年弃用了此软件包:

不推荐使用扳手.js,并且已经有一段时间没有更新了。我强烈建议使用fs-extra进行任何额外的文件系统操作。

老丝梅樱2020/03/20 10:33:44

另一个不错的npm软件包是glob

npm install glob

它非常强大,可以满足您的所有递归需求。

编辑:

我实际上对glob并不十分满意,所以我创建了readdirp

我非常有信心,它的API使得递归查找文件和目录以及应用特定过滤器变得非常容易。

通读其文档,以更好地了解其功能并通过以下方式进行安装:

npm install readdirp

Gil飞云2020/03/20 10:33:44

万一有人发现它有用,我还整理了一个同步版本。

var walk = function(dir) {
    var results = [];
    var list = fs.readdirSync(dir);
    list.forEach(function(file) {
        file = dir + '/' + file;
        var stat = fs.statSync(file);
        if (stat && stat.isDirectory()) { 
            /* Recurse into a subdirectory */
            results = results.concat(walk(file));
        } else { 
            /* Is a file */
            results.push(file);
        }
    });
    return results;
}

提示:过滤时使用较少的资源。在此函数本身中进行过滤。例如,results.push(file);用下面的代码替换根据需要进行调整:

    file_type = file.split(".").pop();
    file_name = file.split(/(\\|\/)/g).pop();
    if (file_type == "json") results.push(file);