# bare-fs Native file system operations for Bare. The API closely follows that of the Node.js `fs` module. ``` npm i bare-fs ``` ## Usage ```js const fs = require('bare-fs') const fd = await fs.open('hello.txt') const buffer = Buffer.alloc(1024) try { const length = await fs.read(fd, buffer) console.log('Read', length, 'bytes') } finally { await fs.close(fd) } ``` ## API #### `const fd = await fs.open(filepath[, flags[, mode]])` Open a file, returning a file descriptor. `flags` defaults to `'r'` and `mode` defaults to `0o666`. `flags` may be a string such as `'r'`, `'w'`, `'a'`, `'r+'`, etc., or a numeric combination of `fs.constants` flags. #### `fs.open(filepath[, flags[, mode]], callback)` Callback version of `fs.open()`. #### `const fd = fs.openSync(filepath[, flags[, mode]])` Synchronous version of `fs.open()`. #### `await fs.close(fd)` Close a file descriptor. #### `fs.close(fd, callback)` Callback version of `fs.close()`. #### `fs.closeSync(fd)` Synchronous version of `fs.close()`. #### `await fs.access(filepath[, mode])` Check whether the file at `filepath` is accessible. `mode` defaults to `fs.constants.F_OK`. #### `fs.access(filepath[, mode], callback)` Callback version of `fs.access()`. #### `fs.accessSync(filepath[, mode])` Synchronous version of `fs.access()`. #### `const exists = await fs.exists(filepath)` Check whether a file exists at `filepath`. Returns `true` if the file is accessible, `false` otherwise. #### `fs.exists(filepath, callback)` Callback version of `fs.exists()`. #### `const exists = fs.existsSync(filepath)` Synchronous version of `fs.exists()`. #### `const bytesRead = await fs.read(fd, buffer[, offset[, len[, pos]]])` Read from a file descriptor into `buffer`. `offset` defaults to `0`, `len` defaults to `buffer.byteLength - offset`, and `pos` defaults to `-1` (current position). Returns the number of bytes read. #### `fs.read(fd, buffer[, offset[, len[, pos]]], callback)` Callback version of `fs.read()`. #### `const bytesRead = fs.readSync(fd, buffer[, offset[, len[, pos]]])` Synchronous version of `fs.read()`. #### `const bytesRead = await fs.readv(fd, buffers[, pos])` Read from a file descriptor into an array of `buffers`. `pos` defaults to `-1`. #### `fs.readv(fd, buffers[, pos], callback)` Callback version of `fs.readv()`. #### `const bytesRead = fs.readvSync(fd, buffers[, pos])` Synchronous version of `fs.readv()`. #### `const bytesWritten = await fs.write(fd, data[, offset[, len[, pos]]])` Write `data` to a file descriptor. When `data` is a string, the signature is `fs.write(fd, data[, pos[, encoding]])` where `encoding` defaults to `'utf8'`. Returns the number of bytes written. #### `fs.write(fd, data[, offset[, len[, pos]]], callback)` Callback version of `fs.write()`. #### `const bytesWritten = fs.writeSync(fd, data[, offset[, len[, pos]]])` Synchronous version of `fs.write()`. #### `const bytesWritten = await fs.writev(fd, buffers[, pos])` Write an array of `buffers` to a file descriptor. `pos` defaults to `-1`. #### `fs.writev(fd, buffers[, pos], callback)` Callback version of `fs.writev()`. #### `const bytesWritten = fs.writevSync(fd, buffers[, pos])` Synchronous version of `fs.writev()`. #### `const stats = await fs.stat(filepath)` Get the status of a file. Returns a `Stats` object. #### `fs.stat(filepath, callback)` Callback version of `fs.stat()`. #### `const stats = fs.statSync(filepath)` Synchronous version of `fs.stat()`. #### `const stats = await fs.lstat(filepath)` Like `fs.stat()`, but if `filepath` is a symbolic link, the link itself is statted, not the file it refers to. #### `fs.lstat(filepath, callback)` Callback version of `fs.lstat()`. #### `const stats = fs.lstatSync(filepath)` Synchronous version of `fs.lstat()`. #### `const stats = await fs.fstat(fd)` Get the status of a file by its file descriptor. Returns a `Stats` object. #### `fs.fstat(fd, callback)` Callback version of `fs.fstat()`. #### `const stats = fs.fstatSync(fd)` Synchronous version of `fs.fstat()`. #### `const stats = await fs.statfs(filepath)` Get filesystem statistics. Returns a `StatFs` object. #### `fs.statfs(filepath, callback)` Callback version of `fs.statfs()`. #### `const stats = fs.statfsSync(filepath)` Synchronous version of `fs.statfs()`. #### `await fs.ftruncate(fd[, len])` Truncate a file to `len` bytes. `len` defaults to `0`. #### `fs.ftruncate(fd[, len], callback)` Callback version of `fs.ftruncate()`. #### `fs.ftruncateSync(fd[, len])` Synchronous version of `fs.ftruncate()`. #### `await fs.chmod(filepath, mode)` Change the permissions of a file. `mode` may be a numeric mode or a string that will be parsed as octal. #### `fs.chmod(filepath, mode, callback)` Callback version of `fs.chmod()`. #### `fs.chmodSync(filepath, mode)` Synchronous version of `fs.chmod()`. #### `await fs.fchmod(fd, mode)` Change the permissions of a file by its file descriptor. #### `fs.fchmod(fd, mode, callback)` Callback version of `fs.fchmod()`. #### `fs.fchmodSync(fd, mode)` Synchronous version of `fs.fchmod()`. #### `await fs.chown(filepath, uid, gid)` Change the owner and group of a file. **NOTE**: The `chown` functions are not implemented on Windows. #### `fs.chown(filepath, uid, gid, callback)` Callback version of `fs.chown()`. #### `await fs.chownSync(filepath, uid, gid)` Synchronous version of `fs.chown()`. #### `await fs.lchown(filepath, uid, gid)` Change the owner and group of a file, but if `filepath` is a symbolic link, the changes are applied only to the link, not the file it refers to. #### `fs.lchown(filepath, uid, gid, callback)` Callback version of `fs.lchown()`. #### `fs.lchownSync(filepath, uid, gid)` Synchronous version of `fs.lchown()`. #### `await fs.fchown(filepath, uid, gid)` Change the owner and group of a file by its file descriptor. #### `fs.fchown(filepath, uid, gid, callback)` Callback version of `fs.fchown()`. #### `fs.fchownSync(filepath, uid, gid)` Synchronous version of `fs.fchown()`. #### `await fs.utimes(filepath, atime, mtime)` Change the access and modification times of a file. Times may be numbers (seconds since epoch) or `Date` objects. #### `fs.utimes(filepath, atime, mtime, callback)` Callback version of `fs.utimes()`. #### `fs.utimesSync(filepath, atime, mtime)` Synchronous version of `fs.utimes()`. #### `await fs.lutimes(filepath, atime, mtime)` Like `fs.utimes()`, but if `filepath` is a symbolic link, the timestamps of the link is changed, not the file it refers to. #### `fs.lutimes(filepath, atime, mtime, callback)` Callback version of `fs.lutimes()`. #### `fs.lutimesSync(filepath, atime, mtime)` Synchronous version of `fs.lutimes()`. #### `await fs.futimes(fd, atime, mtime)` Change the access and modification times of a file by its file descriptor. Times may be numbers (seconds since epoch) or `Date` objects. #### `fs.futimes(fd, atime, mtime, callback)` Callback version of `fs.futimes()`. #### `fs.futimesSync(fd, atime, mtime)` Synchronous version of `fs.futimes()`. #### `await fs.link(src, dst)` Creates a new link (also known as a hard link) to an existing file. #### `fs.link(src, dst, callback)` Callback version of `fs.link()`. #### `fs.linkSync(src, dst)` Synchronous version of `fs.link()`. #### `await fs.mkdir(filepath[, opts])` Create a directory at `filepath`. Options include: ```js options = { mode: 0o777, recursive: false } ``` If `opts` is a number, it is treated as the `mode`. When `recursive` is `true`, parent directories are created as needed. #### `fs.mkdir(filepath[, opts], callback)` Callback version of `fs.mkdir()`. #### `fs.mkdirSync(filepath[, opts])` Synchronous version of `fs.mkdir()`. #### `const path = await fs.mkdtemp(prefix)` Create a unique temporary directory. #### `fs.mkdtemp(prefix, callback)` Callback version of `fs.mkdtemp()`. #### `const path = fs.mkdtempSync(prefix)` Synchronous version of `fs.mkdtemp()`. #### `await fs.rmdir(filepath)` Remove an empty directory. #### `fs.rmdir(filepath, callback)` Callback version of `fs.rmdir()`. #### `fs.rmdirSync(filepath)` Synchronous version of `fs.rmdir()`. #### `await fs.rm(filepath[, opts])` Remove a file or directory at `filepath`. Options include: ```js options = { force: false, recursive: false } ``` When `recursive` is `true`, directories are removed along with their contents. When `force` is `true`, no error is thrown if `filepath` does not exist. #### `fs.rm(filepath[, opts], callback)` Callback version of `fs.rm()`. #### `fs.rmSync(filepath[, opts])` Synchronous version of `fs.rm()`. #### `await fs.unlink(filepath)` Remove a file. #### `fs.unlink(filepath, callback)` Callback version of `fs.unlink()`. #### `fs.unlinkSync(filepath)` Synchronous version of `fs.unlink()`. #### `await fs.rename(src, dst)` Rename a file from `src` to `dst`. #### `fs.rename(src, dst, callback)` Callback version of `fs.rename()`. #### `fs.renameSync(src, dst)` Synchronous version of `fs.rename()`. #### `await fs.copyFile(src, dst[, mode])` Copy a file from `src` to `dst`. `mode` is an optional bitmask created from `fs.constants.COPYFILE_EXCL`, `fs.constants.COPYFILE_FICLONE`, or `fs.constants.COPYFILE_FICLONE_FORCE`. #### `fs.copyFile(src, dst[, mode], callback)` Callback version of `fs.copyFile()`. #### `fs.copyFileSync(src, dst[, mode])` Synchronous version of `fs.copyFile()`. #### `await fs.cp(src, dst[, opts])` Copy a file or directory from `src` to `dst`. Options include: ```js options = { recursive: false } ``` Set `recursive` to `true` to copy directories and their contents. Files are copied preserving their permissions. #### `fs.cp(src, dst[, opts], callback)` Callback version of `fs.cp()`. #### `fs.cpSync(src, dst[, opts])` Synchronous version of `fs.cp()`. #### `const resolved = await fs.realpath(filepath[, opts])` Resolve the real path of `filepath`, expanding all symbolic links. Options include: ```js options = { encoding: 'utf8' } ``` Set `encoding` to `'buffer'` to receive the result as a `Buffer`. #### `fs.realpath(filepath[, opts], callback)` Callback version of `fs.realpath()`. #### `const resolved = fs.realpathSync(filepath[, opts])` Synchronous version of `fs.realpath()`. #### `const target = await fs.readlink(filepath[, opts])` Read the target of a symbolic link. Options include: ```js options = { encoding: 'utf8' } ``` #### `fs.readlink(filepath[, opts], callback)` Callback version of `fs.readlink()`. #### `const target = fs.readlinkSync(filepath[, opts])` Synchronous version of `fs.readlink()`. #### `await fs.truncate(filename[, len])` Truncate the file at `filename` to `len` bytes. `len` defaults to `0`. #### `fs.truncate(filename[, len], callback)` Callback version of `fs.truncate()`. #### `fs.truncateSync(filename[, len])` Synchronous version of `fs.truncate()`. #### `await fs.symlink(target, filepath[, type])` Create a symbolic link at `filepath` pointing to `target`. `type` may be `'file'`, `'dir'`, or `'junction'` (Windows only) or a numeric flag. On Windows, if `type` is not provided, it is inferred from the target. #### `fs.symlink(target, filepath[, type], callback)` Callback version of `fs.symlink()`. #### `fs.symlinkSync(target, filepath[, type])` Synchronous version of `fs.symlink()`. #### `await fs.fsync(fd)` Flush all modified in-core data of the file referred by its file descriptor to the disk device. #### `fs.fsync(fs, callback)` Callback version of `fs.fsync()`. #### `fs.fsyncSync(fd)` Synchronous version of `fs.fsync()`. #### `await fs.fdatasync(fd)` Similar to `fsync`, but does not flush modified metadata unless necessary. #### `fs.fdatasync(fs, callback)` Callback version of `fs.fdatasync()`. #### `fs.fdatasyncSync(fd)` Synchronous version of `fs.fdatasync()`. #### `const dir = await fs.opendir(filepath[, opts])` Open a directory for iteration. Returns a `Dir` object. Options include: ```js options = { encoding: 'utf8', bufferSize: 32 } ``` #### `fs.opendir(filepath[, opts], callback)` Callback version of `fs.opendir()`. #### `const dir = fs.opendirSync(filepath[, opts])` Synchronous version of `fs.opendir()`. #### `const entries = await fs.readdir(filepath[, opts])` Read the contents of a directory. Returns an array of filenames or, if `withFileTypes` is `true`, an array of `Dirent` objects. Options include: ```js options = { encoding: 'utf8', withFileTypes: false, recursive: false } ``` #### `fs.readdir(filepath[, opts], callback)` Callback version of `fs.readdir()`. #### `const entries = fs.readdirSync(filepath[, opts])` Synchronous version of `fs.readdir()`. #### `const data = await fs.readFile(filepath[, opts])` Read the entire contents of a file. Returns a `Buffer` by default, or a string if an `encoding` is specified. Options include: ```js options = { encoding: 'buffer', flag: 'r' } ``` #### `fs.readFile(filepath[, opts], callback)` Callback version of `fs.readFile()`. #### `const data = fs.readFileSync(filepath[, opts])` Synchronous version of `fs.readFile()`. #### `await fs.writeFile(filepath, data[, opts])` Write `data` to a file, replacing it if it already exists. Options include: ```js options = { encoding: 'utf8', flag: 'w', mode: 0o666 } ``` #### `fs.writeFile(filepath, data[, opts], callback)` Callback version of `fs.writeFile()`. #### `fs.writeFileSync(filepath, data[, opts])` Synchronous version of `fs.writeFile()`. #### `await fs.appendFile(filepath, data[, opts])` Append `data` to a file, creating it if it does not exist. Accepts the same options as `fs.writeFile()` but defaults to the `'a'` flag. #### `fs.appendFile(filepath, data[, opts], callback)` Callback version of `fs.appendFile()`. #### `fs.appendFileSync(filepath, data[, opts])` Synchronous version of `fs.appendFile()`. #### `const watcher = fs.watch(filepath[, opts], callback)` Watch a file or directory for changes. Returns a `Watcher` object. The `callback`, if provided, is called with `(eventType, filename)` on each change. Options include: ```js options = { persistent: true, recursive: false, encoding: 'utf8' } ``` #### `const stream = fs.createReadStream(path[, opts])` Create a readable stream for a file. Returns a `ReadStream`. Options include: ```js options = { fd: -1, flags: 'r', mode: 0o666, start: 0, end: Infinity } ``` If `fd` is provided, `path` may be `null` and the stream reads from the given file descriptor. #### `const stream = fs.createWriteStream(path[, opts])` Create a writable stream for a file. Returns a `WriteStream`. Options include: ```js options = { fd: -1, flags: 'w', mode: 0o666 } ``` If `fd` is provided, `path` may be `null` and the stream writes to the given file descriptor. #### `fs.constants` An object containing file system constants. See `fs/constants` for the full list. Commonly used constants include: - `fs.constants.O_RDONLY`, `fs.constants.O_WRONLY`, `fs.constants.O_RDWR` — file access flags - `fs.constants.O_CREAT`, `fs.constants.O_TRUNC`, `fs.constants.O_APPEND` — file creation flags - `fs.constants.F_OK`, `fs.constants.R_OK`, `fs.constants.W_OK`, `fs.constants.X_OK` — file accessibility flags - `fs.constants.S_IFMT`, `fs.constants.S_IFREG`, `fs.constants.S_IFDIR`, `fs.constants.S_IFLNK` — file type flags - `fs.constants.COPYFILE_EXCL`, `fs.constants.COPYFILE_FICLONE`, `fs.constants.COPYFILE_FICLONE_FORCE` — copy flags ### `Stats` Returned by `fs.stat()`, `fs.lstat()`, and `fs.fstat()`. #### `stats.dev` The device identifier. #### `stats.mode` The file mode (type and permissions). #### `stats.nlink` The number of hard links. #### `stats.uid` The user identifier of the file owner. #### `stats.gid` The group identifier of the file owner. #### `stats.rdev` The device identifier for special files. #### `stats.blksize` The file system block size for I/O operations. #### `stats.ino` The inode number. #### `stats.size` The size of the file in bytes. #### `stats.blocks` The number of 512-byte blocks allocated. #### `stats.atimeMs` The access time in milliseconds since the epoch. #### `stats.mtimeMs` The modification time in milliseconds since the epoch. #### `stats.ctimeMs` The change time in milliseconds since the epoch. #### `stats.birthtimeMs` The creation time in milliseconds since the epoch. #### `stats.atime` The access time as a `Date` object. #### `stats.mtime` The modification time as a `Date` object. #### `stats.ctime` The change time as a `Date` object. #### `stats.birthtime` The creation time as a `Date` object. #### `stats.isDirectory()` Returns `true` if the file is a directory. #### `stats.isFile()` Returns `true` if the file is a regular file. #### `stats.isBlockDevice()` Returns `true` if the file is a block device. #### `stats.isCharacterDevice()` Returns `true` if the file is a character device. #### `stats.isFIFO()` Returns `true` if the file is a FIFO (named pipe). #### `stats.isSymbolicLink()` Returns `true` if the file is a symbolic link. Only meaningful when using `fs.lstat()`. #### `stats.isSocket()` Returns `true` if the file is a socket. ### `Dir` Returned by `fs.opendir()`. Supports both synchronous and asynchronous iteration. #### `dir.path` The path of the directory. #### `const dirent = await dir.read()` Read the next directory entry. Returns a `Dirent` or `null` when all entries have been read. #### `dir.read(callback)` Callback version of `dir.read()`. #### `const dirent = dir.readSync()` Synchronous version of `dir.read()`. #### `await dir.close()` Close the directory handle. #### `dir.close(callback)` Callback version of `dir.close()`. #### `dir.closeSync()` Synchronous version of `dir.close()`. ### `Dirent` Represents a directory entry, returned when iterating a `Dir` or using `fs.readdir()` with `withFileTypes: true`. #### `dirent.parentPath` The path of the parent directory. #### `dirent.name` The name of the directory entry, as a string or `Buffer` depending on the encoding. #### `dirent.type` The numeric type of the directory entry. #### `dirent.isFile()` Returns `true` if the entry is a regular file. #### `dirent.isDirectory()` Returns `true` if the entry is a directory. #### `dirent.isSymbolicLink()` Returns `true` if the entry is a symbolic link. #### `dirent.isFIFO()` Returns `true` if the entry is a FIFO. #### `dirent.isSocket()` Returns `true` if the entry is a socket. #### `dirent.isCharacterDevice()` Returns `true` if the entry is a character device. #### `dirent.isBlockDevice()` Returns `true` if the entry is a block device. ### `ReadStream` A readable stream for file data, created by `fs.createReadStream()`. Extends `Readable` from . #### `stream.path` The file path, or `null` if opened by file descriptor. #### `stream.fd` The underlying file descriptor. #### `stream.flags` The flags the file was opened with. #### `stream.mode` The mode the file was opened with. ### `WriteStream` A writable stream for file data, created by `fs.createWriteStream()`. Extends `Writable` from . #### `stream.path` The file path, or `null` if opened by file descriptor. #### `stream.fd` The underlying file descriptor. #### `stream.flags` The flags the file was opened with. #### `stream.mode` The mode the file was opened with. ### `Watcher` Watches for file system changes, created by `fs.watch()`. Extends `EventEmitter` from . #### `watcher.close()` Stop watching for changes. #### `watcher.ref()` Prevent the event loop from exiting while the watcher is active. #### `watcher.unref()` Allow the event loop to exit even if the watcher is still active. #### `event: 'change'` Emitted with `(eventType, filename)` when a change is detected. `eventType` is either `'rename'` or `'change'`. #### `event: 'error'` Emitted with `(err)` when an error occurs. #### `event: 'close'` Emitted when the watcher is closed. ### `FileHandle` Returned by `require('bare-fs/promises').open()`. Provides an object-oriented API for working with file descriptors. #### `await handle.close()` Close the file handle. #### `const { bytesRead, buffer } = await handle.read(buffer[, offset[, len[, pos]]])` Read from the file into `buffer`. #### `const { bytesRead, buffers } = await handle.readv(buffers[, pos])` Read from the file into an array of `buffers`. #### `const { bytesWritten, buffer } = await handle.write(data[, offset[, len[, pos]]])` Write `data` to the file. #### `const { bytesWritten, buffers } = await handle.writev(buffers[, pos])` Write an array of `buffers` to the file. #### `const stats = await handle.stat()` Get the status of the file. #### `await handle.chmod(mode)` Change the permissions of the file. #### `await handle.chown(uid, gid)` Change the owner and group of the file. **NOTE**: This function is not implemented on Windows. #### `await handle.datasync()` Similar to `fsync`, but does not flush modified metadata unless necessary. #### `await handle.sync()` Flush all modified in-core data of the file. #### `await handle.truncate(len)` Truncate the file. #### `await handle.utimes(mode)` Change the access and modification times of the file. #### `const stream = handle.createReadStream([opts])` Create a readable stream for the file. #### `const stream = handle.createWriteStream([opts])` Create a writable stream for the file. #### `handle.fd` The file descriptor number. #### `event: 'close'` Emitted when the file handle is closed. ## License Apache-2.0