---
tags:
  - backend
  - node-js
---

# fs module

File System is an essential built-in module of Node that contains utility
methods for working with files and directories.

Every method associated with `fs` has a _blocking_ and _asynchronous_
implementation. The former obviously blocks the
[event queue](Event_loop.md), the
latter does not.

The synchronous methods are useful to have in some contexts but in general and
with real-world applications, you should be using the async implementation so as
to accord with the single-threaded event-driven architecture of Node.

## Common I/0 methods

### Read directory

Return a string array of all files in the current directory.

```js
fs.readdir("./", function (err, files) {
  if (err) {
    console.error(err);
  } else {
    console.log(files);
  }
});
```

### Read from file

```js
fs.readFile("./lorem.md", "UTF-8", function (err, fileContents) {
  console.log(fileContents);
});
```

### Write to file

```js
let md = `A new file`;

fs.writeFile("testFile.md", md.trim(), function () {
  console.log("File was created");
});
```

### Appending to file

```js
fs.appendFile("testFile.md", "new content");
```

### Create directory

```js
if (!fs.existsSync("directory_name")) {
  fs.mkdir("directory_name", function (err) {
    if (err) {
      console.err(err);
    }
  });
} else {
  console.warn("Directory already exists");
}
```

### Rename and remove files

```js
fs.rename("./filename.js", "./newname.js", function () {
  console.log("file renamed");
});
```

```js
// Remove file
fs.unlink("./file-to-delete", function (err) {
  if (err) {
    console.error(err);
  }
});
```

### Rename and remove directories

```js
// Best to use synchronous method here
fs.rmSync("/dir", { recursive: true, force: true });
```

## Streams

See [Handling streams with fs](Streams.md)
