rrdir recursively reads a directory and returns entries within via an async iterator or async/sync as Array. It can typically iterate millions of files in a matter of seconds. The async iterator holds only one directory level in memory at a time, the Array variants hold all entries.
This module is able to read any path including ones that contain invalid UTF-8 sequences.
| Benchmark | rrdir | fdir |
|---|---|---|
| async | 60ms | 59ms |
| sync | 153ms | 167ms |
| async + glob | 57ms | 56ms |
| sync + glob | 169ms | 185ms |
| async + exclude | 37ms | 37ms |
| sync + exclude | 114ms | 107ms |
| async iterator | 78ms | — |
Results for 122K entries (111K files, 11K dirs), Node.js on macOS. rrdir returns richer entries (path + directory + symlink) while fdir returns only paths. fdir uses picomatch for glob matching, rrdir has a built-in glob matcher. Run with make bench.
npm i rrdirimport {rrdir, rrdirAsync, rrdirSync} from "rrdir";
for await (const entry of rrdir("dir")) {
// => {path: 'dir/file', directory: false, symlink: false}
}
const entries = await rrdirAsync("dir");
// => [{path: 'dir/file', directory: false, symlink: false}]
const entries = rrdirSync("dir");
// => [{path: 'dir/file', directory: false, symlink: false}]rrdir is an async iterator which yields entry. rrdirAsync and rrdirSync return an Array of entry.
The directory to read, either absolute or relative. Pass a Uint8Array to switch the module into Uint8Array mode which is required to be able to read every file, like for example files with names that are invalid UTF-8 sequences.
statsboolean: Whether to includeentry.stats. Will reduce performance. Default:false.followSymlinksboolean: Whether to follow symlinks for both recursion andstatcalls. Default:false.excludeArray: Path globs to exclude, e.g.["**.js"]. Excluding a directory prunes its subtree. Default:undefined.includeArray: Path globs to include, e.g.["**.map"]. Default:undefined.
include and exclude support * (any characters except /), ** (any characters) and ? (one character except /). Character classes and brace expansion are not supported.
strictboolean: Whether to throw immediately when reading an entry fails. Default:false.insensitiveboolean: Whetherincludeandexcludematch case-insensitively. Default:false.
pathstring | Uint8Array: The path to the entry, will be relative ifdiris given relative. Ifdiris aUint8Array, this will be too. Always present.directoryboolean: Boolean indicating whether the entry is a directory.undefinedon error.symlinkboolean: Boolean indicating whether the entry is a symbolic link.undefinedon error.statsObject: Afs.statsobject, present whenoptions.statsis set.undefinedon error.errError: Any error encountered while reading this entry.undefinedon success.
© silverwind, distributed under BSD licence