UNPKG

2.55 kBJavaScriptView Raw
1var fs = require('fs');
2var execFile = require('child_process').execFile;
3
4
5/**
6 * Walk a directory in a paralell loop.
7 * http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search
8 *
9 * Usage:
10 * > walk('./path/to/directory', callbackFunction);
11 *
12 */
13function walk(dir, done) {
14 var results = [];
15 fs.readdir(dir, function(err, list) {
16 if (err) return done(err);
17 var pending = list.length;
18 if (!pending) return done(null, results);
19 list.forEach(function(file) {
20 file = dir + '/' + file;
21 fs.stat(file, function(err, stat) {
22 if (stat && stat.isDirectory()) {
23 walk(file, function(err, res) {
24 results = results.concat(res);
25 if (!--pending) done(null, results);
26 });
27 } else {
28 results.push(file);
29 if (!--pending) done(null, results);
30 }
31 });
32 });
33 });
34}
35
36
37/**
38 * Walk a directory in a serial loop.
39 * http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search
40 *
41 * Usage:
42 * > walk('./path/to/directory', callbackFunction);
43 *
44 */
45function walkSerial(dir, done) {
46 var results = [];
47 fs.readdir(dir, function(err, list) {
48 if (err) return done(err);
49 var i = 0;
50 (function next() {
51 var file = list[i++];
52 if (!file) return done(null, results);
53 file = dir + '/' + file;
54 fs.stat(file, function(err, stat) {
55 if (stat && stat.isDirectory()) {
56 walk(file, function(err, res) {
57 results = results.concat(res);
58 next();
59 });
60 } else {
61 results.push(file);
62 next();
63 }
64 });
65 })();
66 });
67}
68
69
70/**
71 * Wrapper for the UNIX find function. Possibly faster than the walk()
72 * function above, particularly when multiple similar find commands are called
73 * due to the find tool's built-in caching.
74 * http://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search
75 *
76 * Usage:
77 * > find('./path/to/directory', callbackFunction);
78 *
79 */
80function find(path, callback) {
81 execFile('find', [path], function(err, stdout, stderr) {
82 var fileList = stdout.split('\n');
83 callback(err, fileList);
84 });
85}
86
87
88exports.walk = walk;
89exports.find = find;