Skip to content

Commit d9e661e

Browse files
committed
Added DirectoryWalker.js
1 parent cc0ee29 commit d9e661e

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

DirectoryWalker.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/* vim: set et sw=2 ts=2: */
2+
/* jshint node: true */
3+
'use strict';
4+
5+
var fs = require('fs');
6+
var path = require('path');
7+
var EventEmitter = require('events').EventEmitter;
8+
var util = require('util');
9+
10+
function DirectoryWalker(options) {
11+
12+
EventEmitter.call(this);
13+
var self = this;
14+
15+
options = options || {};
16+
17+
var dirFilter = null;
18+
if (typeof options.dirFilter === 'function') {
19+
dirFilter = options.dirFilter;
20+
}
21+
22+
var fileFilter = null;
23+
if (typeof options.fileFilter === 'function') {
24+
fileFilter = options.fileFilter;
25+
}
26+
27+
this.walk = function walk(directory) {
28+
29+
var spawned = 0;
30+
31+
function ready() {
32+
spawned -= 1;
33+
if (spawned === 0) {
34+
self.emit('end');
35+
}
36+
}
37+
38+
function done(directory, err, files) {
39+
if (err) {
40+
self.emit('error', directory, err);
41+
} else {
42+
files.forEach(function (file) {
43+
file = path.join(directory, file);
44+
self.emit('entry', file);
45+
46+
spawned += 1;
47+
fs.stat(file, function (err, stats) {
48+
if (err) {
49+
self.emit('error', file, err);
50+
51+
} else {
52+
self.emit('stats', file, stats);
53+
54+
if (stats.isDirectory()) {
55+
if (dirFilter) {
56+
spawned += 1;
57+
dirFilter(file, function (err, okay) {
58+
if (err) {
59+
self.emit('error', file, err);
60+
} else if (okay) {
61+
self.emit('dir', file);
62+
spawned += 1;
63+
fs.readdir(file, done.bind(null, file));
64+
}
65+
ready();
66+
});
67+
} else {
68+
self.emit('dir', file);
69+
spawned += 1;
70+
fs.readdir(file, done.bind(null, file));
71+
}
72+
73+
} else if (stats.isFile()) {
74+
if (fileFilter) {
75+
spawned += 1;
76+
fileFilter(file, function (err, okay) {
77+
if (err) {
78+
self.emit('error', file, err);
79+
} else if (okay) {
80+
self.emit('file', file);
81+
}
82+
ready();
83+
});
84+
} else {
85+
self.emit('file', file);
86+
}
87+
}
88+
}
89+
ready();
90+
});
91+
});
92+
}
93+
ready();
94+
}
95+
96+
spawned += 1;
97+
fs.readdir(directory, done.bind(null, directory));
98+
};
99+
}
100+
101+
util.inherits(DirectoryWalker, EventEmitter);
102+
103+
module.exports = DirectoryWalker;

0 commit comments

Comments
 (0)