Rrdir
Recursive directory reader with a delightful API
Install / Use
/learn @silverwind/RrdirREADME
rrdir
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. Memory usage is O(1) for the async iterator and O(n) for the Array variants.
This module is able to read any path including ones that contain invalid UTF-8 sequences.
| Benchmark | rrdir | fdir | |---|---|---| | async | 57ms | 58ms | | sync | 153ms | 177ms | | async + glob | 59ms | 63ms | | sync + glob | 173ms | 195ms | | async + exclude | 45ms | 36ms | | sync + exclude | 118ms | 114ms | | async iterator | 77ms | — |
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.
Usage
npm i rrdir
import {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}]
API
rrdir(dir, [options])
rrdirAsync(dir, [options])
rrdirSync(dir, [options])
rrdir is an async iterator which yields entry. rrdirAsync and rrdirSync return an Array of entry.
dir String | Uint8Array
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.
options Object
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"]. Default:undefined.includeArray: Path globs to include, e.g.["**.map"]. Default:undefined.strictboolean: Whether to throw immediately when reading an entry fails. Default:false.insensitiveboolean: Whetherincludeandexcludematch case-insensitively. Default:false.
entry Object
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
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
