1 | var fs = require('fs');
|
2 | var 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 | */
|
13 | function 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 | */
|
45 | function 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 | */
|
80 | function 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 |
|
88 | exports.walk = walk;
|
89 | exports.find = find;
|