Skip to content

Instantly share code, notes, and snippets.

@NuckChorris
Created February 23, 2012 07:30
Show Gist options
  • Select an option

  • Save NuckChorris/1891309 to your computer and use it in GitHub Desktop.

Select an option

Save NuckChorris/1891309 to your computer and use it in GitHub Desktop.
Recursive Directory Scanner
var fs = require('fs');
var path = require('path');
var util = require("util");
var merge = require('./merge.js');
var DirScanner = function (dir, options) {
this.path = dir;
this.options = merge(this.options, options);
};
util.inherits(DirScanner, process.EventEmitter);
DirScanner.prototype.scan = function () {
var dir = this.path;
var self = this;
fs.readdir(dir, function (err, files) {
if (err) return self.emit('error', err);
var n = 0;
for (var i = 1, l = files.length, ll = l-1; i < l; i++) {
(function (filename, i) {
var file = path.join(dir, filename);
fs.stat(file, function (err, stats) {
if (stats.isDirectory()) {
self.emit('directory', dir, filename);
var scan = new DirScanner(file);
scan.on('file', function (dir, filename) {
self.emit('file', dir, filename);
});
scan.on('directory', function (dir, filename) {
self.emit('directory', dir, filename);
});
scan.on('error', function (err) {
self.emit('error', err);
});
scan.on('end', function () {
if (++n === ll) {
self.emit('end');
}
});
scan.scan();
} else if (stats.isFile()) {
self.emit('file', dir, filename);
if (++n === ll) {
self.emit('end');
}
} else {
if (++n === ll) {
self.emit('end');
}
}
});
})(files[i], i);
}
});
};
module.exports = DirScanner;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment