function readDir(start, callback) { // Use lstat to resolve symlink if we are passed a symlink fs.lstat(start, function(err, stat) { if(err) { return callback(err); } var found = {dirs: [], files: []}, total = 0, processed = 0; function isDir(abspath) { fs.stat(abspath, function(err, stat) { if(stat.isDirectory()) { found.dirs.push(abspath); // If we found a directory, recurse! readDir(abspath, function(err, data) { found.dirs = found.dirs.concat(data.dirs); found.files = found.files.concat(data.files); if(++processed == total) { callback(null, found); } }); } else { found.files.push(abspath); if(++processed == total) { callback(null, found); } } }); } // Read through all the files in this directory if(stat.isDirectory()) { fs.readdir(start, function (err, files) { total = files.length; for(var x=0, l=files.length; x