diff --git a/lib/wrench.js b/lib/wrench.js index 877c2a6..c54e63f 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -11,7 +11,50 @@ * ~ Ryan McGrath (ryan [at] venodesigns.net) */ -var fs = require("fs"); +var fs = require("fs"), + _path = require("path"); + + +/* wrench.readdirSyncRecursive("directory_path"); + * + * Recursively dives through directories and read the contents of all the + * children directories. + */ +exports.readdirSyncRecursive = function(baseDir) { + baseDir = baseDir.replace(/\/$/, ''); + + var readdirSyncRecursive = function(baseDir) { + var files = [], + curFiles, + nextDirs, + isDir = function(fname){ + return fs.statSync( _path.join(baseDir, fname) ).isDirectory(); + }, + prependBaseDir = function(fname){ + return _path.join(baseDir, fname); + }; + + curFiles = fs.readdirSync(baseDir); + nextDirs = curFiles.filter(isDir); + curFiles = curFiles.map(prependBaseDir); + + files = files.concat( curFiles ); + + while (nextDirs.length) { + files = files.concat( readdirSyncRecursive( _path.join(baseDir, nextDirs.shift()) ) ); + } + + return files; + }; + + // convert absolute paths to relative + var fileList = readdirSyncRecursive(baseDir).map(function(val){ + return val.replace(baseDir + '/', ''); + }); + + return fileList; +}; + /* wrench.rmdirSyncRecursive("directory_path", forceDelete, failSilent); * @@ -248,7 +291,7 @@ exports.LineReader = function(filename, bufferSize) { this.buffer = ""; this.fd = fs.openSync(filename, "r"); this.currentPosition = 0; -} +}; exports.LineReader.prototype = { getBufferAndSetCurrentPosition: function(position) { diff --git a/readme.md b/readme.md index e59ec82..e821b19 100644 --- a/readme.md +++ b/readme.md @@ -25,6 +25,9 @@ wrench.mkdirSyncRecursive(dir, 0777); // Recursively delete the entire sub-tree of a directory, then kill the directory wrench.rmdirSyncRecursive('my_directory_name', failSilently); +// Recursively read directories contents. +wrench.readdirSyncRecursive('my_directory_name'); + // Recursively chmod the entire sub-tree of a directory wrench.chmodSyncRecursive('my_directory_name', 0755); diff --git a/tests/mkdirSyncRecursive.js b/tests/mkdirSyncRecursive.js index 8136495..361d892 100644 --- a/tests/mkdirSyncRecursive.js +++ b/tests/mkdirSyncRecursive.js @@ -4,7 +4,7 @@ var wrench = require('wrench'); var path = require('path'); module.exports = testCase({ - testMkdirSyncRecursive: function(test) { + test_mkdirSyncRecursive: function(test) { var dir = __dirname + '/_tmp/foo/bar'; test.equals(path.existsSync(dir), false, 'Dir shouldn\'t exist - clean it up manually?'); diff --git a/tests/readdir/bar.txt b/tests/readdir/bar.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/readdir/foo/bar/ipsum.js b/tests/readdir/foo/bar/ipsum.js new file mode 100644 index 0000000..e69de29 diff --git a/tests/readdir/foo/dolor.md b/tests/readdir/foo/dolor.md new file mode 100644 index 0000000..e69de29 diff --git a/tests/readdir/foo/lorem.txt b/tests/readdir/foo/lorem.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/readdirSyncRecursive.js b/tests/readdirSyncRecursive.js new file mode 100644 index 0000000..6e862f2 --- /dev/null +++ b/tests/readdirSyncRecursive.js @@ -0,0 +1,30 @@ +var testCase = require('nodeunit').testCase; +var fs = require('fs'); +var wrench = require('wrench'); +var path = require('path'); + +module.exports = testCase({ + test_readdirSyncRecursive: function(test) { + var dir = __dirname + '/readdir'; + + test.equals(path.existsSync(dir), true, 'Folders should exist'); + + var check = [ + 'bar.txt', + 'foo', + 'foo/bar', + 'foo/dolor.md', + 'foo/lorem.txt', + 'foo/bar/ipsum.js' + ]; + + var files = wrench.readdirSyncRecursive(dir); + + test.equals(files.length, check.length, 'number of paths is correct'); + test.deepEqual(files, check, 'list shows all files and folders'); + + test.done(); + } +}); + +// vim: et ts=4 sw=4 diff --git a/tests/runner.js b/tests/runner.js new file mode 100644 index 0000000..b353d1f --- /dev/null +++ b/tests/runner.js @@ -0,0 +1,7 @@ +// `nodeunit tests/runner` +// will run all the tests + +module.exports = { + group_mkdirSyncRecursive : require('./mkdirSyncRecursive'), + group_readdirSyncRecursive : require('./readdirSyncRecursive') +};