# node-readfiles A lightweight node.js module to recursively read files in a directory using ES6 Promises. ## Installation npm install node-readfiles ## Usage You can safely add `readfiles` anywhere in your project. ```javascript var readfiles = require('node-readfiles'); ``` ### _Promise(files):_ readfiles(dir, [options], [callback]) Asynchronusly read the files in a directory returning a **Promise**. #### dir A relative or absolute path of the directory to read files. #### options An optional object parameter with the following properties: * **reverse**: a bollean value that reverses the order of the list of files before traversing them (defaults to false) * **filenameFormat**: one of `readfiles.FULL_PATH`, `readfiles.RELATIVE`, or `readfiles.FILENAME`, wether the callback's returns the full-path, relative-path or only the filenames of the traversed files. (default is `readfiles.RELATIVE`) * **rejectOnError**: a bollean value wether to stop and trigger the "doneCallback" when an error occurs (defaults to true) * **filter**: a string, or an array of strings of path expression that match the files being read (defaults to '**') * `?` matches one character * `*` matches zero or more characters * `**` matches zero or more 'directories' in a path * **readContents**: a boolean value wether to read the file contents when traversing the files [\[1\]](#read-files) (defaults to true) * **encoding**: a string with the encoding used when reading a file (defaults to 'utf8') * **depth**: an integer value which limits the number sub-directories levels to traverse for the given path where `-1` is infinte, and `0` is none (defaults to -1) * **hidden**: a boolean value wether to exclude hidden files prefixed with a `.` (defaults to true) ### callback(err, filename, content, stat) The optional callback function is triggered everytime a file is found. If there's an error while reading the file the `err` parameter will contain the error that occured, When `readContents` is true, the `contents` parameter will be populated with the contents of the file encoded using the `encoding` option. For convenience the `stat` result object is passed to the callback for you to use. [1] The `contents` parameter will be `null` when the `readContents` option is `false`. ##### Asynchronous Callback When working with asynchronous operations, you can simply return a `function (next) { ... }` which will enabled you to completed your asynchronous operation until you call `next()`. ```javascript readfiles('/path/to/dir/', function (err, content, filename, stat) { if (err) throw err; return function (next) { setTimeout(function () { console.log('File ' + filename); next(); }, 3000); }; }); ``` ### _Promise(files)_ When calling `readfiles`, an ES6 Promise is returned with an array of all the files that were found. You can then call `then` or `catch` to see if `readfiles` encountered an error. ```javascript var readfiles = require('node-readfiles'); readfiles('/path/to/dir/', function (err, filename, contents) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); }).catch(function (err) { console.log('Error reading files:', err.message); }); ``` ## Examples The default behavior, is to recursively list all files in a directory. By default `readfiles` will exclude all dot files. ```javascript readfiles('/path/to/dir/', function (err, filename, contents) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); console.log(files.join('\n')); }); ``` Read all files in a directory, excluding sub-directories. ```javascript readfiles('/path/to/dir/', { depth: 0 }, function (err, content, filename) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); console.log(files.join('\n')); }); ``` The above can also be accomplished using the `filter` option. ```javascript readfiles('/path/to/dir/', { filter: '*' // instead of the default '**' }, function (err, content, filename) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); console.log(files.join('\n')); }); ``` Recursively read all files with "txt" extension in a directory and display the contents. ```javascript readfiles('/path/to/dir/', { filter: '*.txt' }, function (err, content, filename) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); }); ``` Recursively read all files with that match "t?t" in a directory and display the contents. ```javascript readfiles('/path/to/dir/', { filter: '*.t?t' }, function (err, content, filename) { if (err) throw err; console.log('File ' + filename + ':'); console.log(content); }).then(function (files) { console.log('Read ' + files.length + ' file(s)'); }); ``` Recursively list all json files in a directory including all sub-directories, without reading the files. ```javascript readfiles('/path/to/dir/', { filter: '*.json', readContents: false }, function (err, content, filename) { if (err) throw err; console.log('File ' + filename); }); ``` ## License MIT licensed (See LICENSE.txt)