Skip to content

Instantly share code, notes, and snippets.

@jedilando
Forked from AndrewRayCode/gist:825583
Created August 27, 2012 15:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jedilando/3489392 to your computer and use it in GitHub Desktop.
Save jedilando/3489392 to your computer and use it in GitHub Desktop.
recursive read directory in node.js returning flattened list of files and directories. Added support for empty dirs
// original gist: https://gist.github.com/825583
// I've added support for empty directories
// i.e. when `start` dir was empty callback was not fired,
// now it is fired like this: callback(null, {dirs: [], files: []})
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;
if(total == 0)
{
callback(null, found);
}
else
{
for(var x=0, l=files.length; x<l; x++) {
isDir(path.join(start, files[x]));
}
}
});
} else {
return callback(new Error("path: " + start + " is not a directory"));
}
});
};
exports.readDir = readDir
@stodge
Copy link

stodge commented Mar 10, 2014

I get an error:

                    isDir(path.join(start, files[x]));
                          ^

ReferenceError: path is not defined

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment