2017-03-04 188 views
0

我知道如何目录结构成JSON对象转换,从here转换目录结构,文件系统,以JSON对象

不过,我想与对象键阵列中的全部中目标的文件,文件夹文件夹名称。我一直在尝试很长时间,但无法完成。

氏是我到目前为止已经试过:提前

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); 
      } 
     } 
     }); 
    }); 
    }); 
}; 

感谢。 :)

+0

让我们了解您到目前为止试过。 – georoot

+0

更新了问题,看看 – aditya

+0

我现在不能尝试,但我想问题是你的代码是同步的,因为它使用* fs *模块和回调。我会尝试在调用diretoryTreeToObj(file,....')的下面添加一个'console.log(file)'来查看你是否获得了多次相同的文件名,还可以指定什么不起作用?你有什么错误吗? – Molda

回答

0

最后我想出的解决方案,这如果有人需要它:

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); 
      } 
     } 
     }); 
    }); 
    }); 
};