The Codex / JavaScript / fs — File System

fs — File System

Reading, writing, and manipulating files and directories in Node.js — fs/promises, streams, watching files, and common patterns.

What it is, in plain English: The fs module (built into Node.js) provides APIs for working with the file system. Use fs/promises for async file operations with async/await. readFile() reads an entire file into memory. writeFile() writes or creates a file. For large files, use streams (createReadStream/createWriteStream) to process data incrementally. fs.watch() monitors files for changes.

Reading and writing files in Node.js

Node.js only. The fs module doesn't exist in browsers — use browser storage APIs (localStorage, IndexedDB, File System Access API) there.

Import the module

// ESM (recommended — .mjs files or "type": "module" in package.json):
import { readFile, writeFile, mkdir, readdir, stat, unlink, rename } from "fs/promises";
import { existsSync } from "fs";  // sync version (ok for startup checks)

// CommonJS (.js files without "type": "module"):
const { readFile, writeFile } = require("fs/promises");

Reading files

// Read as string:
const text = await readFile("notes.txt", "utf-8");
console.log(text);

// Read JSON:
const raw  = await readFile("config.json", "utf-8");
const conf = JSON.parse(raw);
console.log(conf.port);  // 3000

// Read as Buffer (binary — images, PDFs etc.):
const bytes = await readFile("photo.jpg");  // no encoding = Buffer
console.log(bytes.byteLength, "bytes");

// Handle missing files:
try {
  const data = await readFile("missing.txt", "utf-8");
} catch (e) {
  if (e.code === "ENOENT") console.log("File not found");
  else throw e;  // something unexpected — re-throw
}

Writing files

// Write string (creates file if it doesn't exist, overwrites if it does):
await writeFile("output.txt", "Hello, World!", "utf-8");

// Write JSON:
const data = { name: "Alice", score: 95 };
await writeFile("user.json", JSON.stringify(data, null, 2));

// Append (add to end of file):
import { appendFile } from "fs/promises";
await appendFile("log.txt", `[${new Date().toISOString()}] Server started
`);

Directories

// Create directory (including parents):
await mkdir("dist/css/fonts", { recursive: true });  // won't throw if exists

// List directory:
const files = await readdir("./src");
console.log(files);  // ["app.js", "utils.js", "style.css"]

// Filter to only JS files:
const jsFiles = files.filter(f => f.endsWith(".js"));

// Delete a file:
await unlink("old-file.txt");

// Rename / move:
await rename("old-name.txt", "new-name.txt");
await rename("file.txt", "archive/file.txt");  // also moves across dirs
Try It Yourself

Official Sources

The Codex links only to official documentation and the ECMAScript specification. No third-party tutorials.