The Issue

I have the following directory:

root
 |_ fruits
 |___ apple
 |______images
 |________ apple001.jpg
 |________ apple002.jpg
 |_ animals
 |___ cat
 |______images
 |________ cat001.jpg
 |________ cat002.jpg

I would like to use Node.js to listen directory & all sub-directories and create a JSON which mirrors the directory structure. Each node contains type, name, path and children:

data = [
 {
   type: "folder",
   name: "animals",
   path: "/animals",
   children: [
     {
       type: "folder",
       name: "cat",
       path: "/animals/cat",
       children: [
         {
            type: "folder",
            name: "images",
            path: "/animals/cat/images",
            children: [
              {
                type: "file",
                name: "cat001.jpg",
                path: "/animals/cat/images/cat001.jpg"
              }, {
                type: "file",
                name: "cat001.jpg",
                path: "/animals/cat/images/cat002.jpg"
              }
            ]
          }
        ]
      }
    ]
  }
];

Here is the solution:

var fs = require('fs'),
    path = require('path');
 
function dirTree(filename) {
    var stats = fs.lstatSync(filename),
        info = {
            path: filename,
            name: path.basename(filename)
        };
 
    if (stats.isDirectory()) {
        info.type = "folder";
        info.children = fs.readdirSync(filename).map(function(child) {
            return dirTree(filename + '/' + child);
        });
    } else {
        // Assuming it's a file. In real life it could be a symlink or
        // something else!
        info.type = "file";
    }
 
    return info;
}
 
if (module.parent == undefined) {
    // node dirTree.js ~/foo/bar
    var util = require('util');
    console.log(util.inspect(dirTree(process.argv[2]), false, null));
}

References & Resources

  • http://stackoverflow.com/questions/11194287/