文件夹结构到json

时间:2018-11-01 21:49:46

标签: javascript node.js json

我正在尝试采用一种文件夹结构,并将其转换为这种格式的JSON:

- Folder
-- Image.png
-- Image_1.png
- Folder2
-- Image.png
-- Image_1.png

具有这样的结构:

{
  "Folder": ["Image.png", "Image_1.png"],
  "Folder2": ["Image.png", "Image_1.png"]
}

谢谢。这样可能吗?

编辑:这是我的开始,但是尝试向下钻取到文件夹中的文件夹时递归中断

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

var structure = {};

function findFiles(folder) {
    fs.readdir(folder, (err, files) => {
        files.forEach(file => {
            console.log(file);
            if(fs.lstatSync(__dirname + "/" + file).isDirectory()){
                console.log(folder)
                findFiles(folder + "/" + file);
            }
        });
    })
}

findFiles(__dirname)

1 个答案:

答案 0 :(得分:1)

有趣的问题。这是我的解决方案,使用同步功能。输出JSON将包含一个对象数组,该对象数组可以是字符串(用于文件名)或对象(用于目录)。

代码(live):

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

var dirToJSON = function(dir, done) {
  var results = [];

  function recWalk(d, res) {
    var list = fs.readdirSync(d);
    list.forEach((name) => {
      var tempResults = [];
      var file = path.resolve(d, name);
      var stat = fs.statSync(file);
      if (stat && stat.isDirectory()) {
        recWalk(file, tempResults);
        var obj = {};
        obj[name] = tempResults;
        res.push(obj);
      } else {
        res.push(name);
      }
    });
  }

  try {
    recWalk(dir, results);
    done(null, results);
  } catch(err) {
    done(err);
  }
};

dirToJSON("/home/", function(err, results) {
  if (err) console.log(err);
  else console.log(util.inspect(results, {showHidden: false, depth: null}));
});

输出:

[ { node: [ '.bash_logout', '.bashrc', '.profile' ] },
  { runner: 
     [ '.bash_logout',
       '.bashrc',
       '.profile',
       'config.json',
       'index.js',
       { node_modules: [] },
       'test.js' ] } ]

请注意,我正在使用util.inspect打印结果以允许对象具有无限深度,但是您也可以执行JSON.stringify(results)