Working with File System (fs)

1. Reading Files

Example: Promise API

import fs from "node:fs/promises";
const text = await fs.readFile("a.txt", "utf8");
const bytes = await fs.readFile("img.png"); // Buffer
VariantUse
fs.readFileWhole file into memory
fs.createReadStreamLarge files (streaming)
fs.readFileSyncSync (avoid in servers)

2. Writing Files

APIBehavior
fs.writeFile(path, data)Replace contents
fs.writeFile(path, data, { flag: "wx" })Fail if exists
fs.createWriteStreamStreaming writes

3. Appending to Files (fs.appendFile)

Example

await fs.appendFile("audit.log", `${Date.now()} ${msg}\n`);

4. Checking File Existence

ApproachNotes
await fs.access(path) + try/catchIdiomatic
fs.existsSync(path)Sync only
fs.existsDEPRECATED
Warning: Don't check-then-use (race condition). Just attempt the operation and handle ENOENT.

5. Getting File Stats

APIReturns
fs.stat(path)Stats (follows symlinks)
fs.lstat(path)Stats (no follow)
stat.size / mtime / isFile() / isDirectory()Common fields
{ bigint: true }Use BigInt for large nums

6. Creating Directories

APINotes
fs.mkdir(path)Single dir
fs.mkdir(path, { recursive: true })Like mkdir -p
fs.mkdtemp(prefix)Temp dir with random suffix

7. Reading Directories

APIReturns
fs.readdir(p)Array of names
fs.readdir(p, { withFileTypes: true })Array of Dirent
fs.readdir(p, { recursive: true })Walk tree v20+
fs.opendir(p)Async iterable

8. Deleting Files

APIUse
fs.unlink(p)Delete file
fs.rm(p)File or directory

9. Removing Directories

APIUse
fs.rmdir(p)Empty dir
fs.rm(p, { recursive: true, force: true })Recursive (preferred)

10. Watching Files

Example

const ac = new AbortController();
const watcher = fs.watch("./src", { recursive: true, signal: ac.signal });
for await (const ev of watcher) console.log(ev.eventType, ev.filename);
EventMeaning
changeContent modified
renameCreated / removed / renamed
Note: For reliable cross-platform watching, use chokidar.

11. Using Promises API (fs/promises)

ImportStyle
import fs from "node:fs/promises"Promise-based (preferred)
import fs from "node:fs"Callback + sync

12. Working with File Descriptors

Example: FileHandle

const fh = await fs.open("data.bin", "r+");
try {
  const { bytesRead } = await fh.read(buf, 0, 1024, 0);
  await fh.write(out, 0, out.length, 0);
} finally { await fh.close(); }
FlagMode
rRead
r+Read/write
wWrite (truncate)
wxWrite (fail if exists)
aAppend

13. Copying Files (fs.copyFile)

APIUse
fs.copyFile(src, dest)Single file
fs.cp(src, dest, { recursive: true })Files or directories
Flag COPYFILE_EXCLFail if dest exists

14. Renaming Files (fs.rename)

NoteDetail
Atomic on same filesystemCross-fs may fail
Works for files and dirsSame call
APIUse
fs.symlink(target, path)Create symlink
fs.readlink(path)Read target
fs.realpath(path)Resolve to absolute path
Type (Windows)"file" / "dir" / "junction"