2017-03-04 77 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); 
      } 
     } 
     }); 
    }); 
    }); 
};