将文件系统中的目录结构转换为 Json 对象

Convert directory structure in the filesystem to Json object

我知道如何将目录结构转换为 JSON 对象,来自 here

但我想要一个数组中的所有文件,以及以对象键作为文件夹名称的对象中的文件夹。我已经尝试了很长时间,但就是无法完成。

这是我目前尝试过的方法:

var diretoryTreeToObj = function (dir, done) {
  var results = {};
  var _contents = [];
  fs.readdir(dir, function (err, list) {
    if (err) {
      return done(err);
    }
    var pending = list.length;
    if (!pending) {
      return done(null, {name: path.basename(dir), type: 'folder', children: results});
    }
    list.forEach(function (file, index) {
      file = path.resolve(dir, file);
      fs.stat(file, function (err, stat) {
        if (stat && stat.isDirectory()) {
          diretoryTreeToObj(file, function (err, res) {
            results[path.basename(file)] = {
              name: path.basename(file),
              type: 'folder',
              path: path.dirname(file),
              _contents: [res]
            };
            if (!--pending) {
              done(null, results);
            }
          });
        } else {
          results['_contents'] = [{
            name: path.basename(file),
            path: file
          }];
          if (!--pending) {
            done(null, results);
          }
        }
      });
    });
  });
};

提前致谢。 :)

终于找到解决办法了,如果有人需要的话,就在这里:

var diretoryTreeToObj = function (dir, done) {
  var results = {};
  var _contents = [];
  var files = [];
  fs.readdir(dir, function (err, list) {
    if (err) {
      return done(err);
    }
    var pending = list.length;
    if (!pending) {
      return done(null, {name: path.basename(dir), type: 'folder', children: results});
    }
    list.forEach(function (file, index) {
      file = path.resolve(dir, file);
      fs.stat(file, function (err, stat) {
        results['_contents'] = files;
        if (stat && stat.isDirectory()) {
          diretoryTreeToObj(file, function (err, res) {
            results[path.basename(file)] = res;
            if (!--pending) {
              done(null, results);
            }
          });
        } else {
          files.push({
            name: path.basename(file),
            path: file
          });
          results['_contents'] = files;
          if (!--pending) {
            done(null, results);
          }
        }
      });
    });
  });
};