Node.js — Check If a Path or File Exists

When interacting with the file system, you may want to check whether a file exists on the hard disk at a given path. Node.js comes with the fs core module allowing you to interact with the hard disk.

This tutorial shows you how to use Node.js to determine whether a file exists on disk.

Node.js Series Overview

Asynchronously Check if a File Exists in Node.js

The fs module in Node.js comes with a deprecated exists method. It’s recommended not to use this method anymore. Instead, you should use the Fs#access method to check whether a file exists.

Well, Fs#access doesn’t return the desired boolean value (true/false). Instead, it expects a callback with an error as the only argument. The callback support comes from the early days of Node.js where asynchronous operations used callbacks.

Starting in version 10.0, Node.js added support for promises and async/await for the fs module. This tutorial assumes you’re using async/await for flow control of your code. Then, you can use the require('fs').promises version of Fs#access which is usable with async/await.

Here’s a helper method returning the boolean value whether a file exists at the given path:

const { promises: Fs } = require('fs')

async function exists (path) {  
  try {
    await Fs.access(path)
    return true
  } catch {
    return false

// Example:
const Path = require('path')  
const path = Path.join(__dirname, "existing-file.txt")

await exists(path)  
// true

Synchronously Check if a File Exists

You may also use the synchronous method Fs#existsSync to check whether a file exists on your hard disk. Please notice that this method blocks the Node.js event loop for other operations while processing the file existence check:

const Fs = require('fs')  
const Path = require('path')

const path = Path.join(__dirname, "existing-file.txt")

// true

Use the @supercharge/filesystem Package

I’m the maintainer of the @supercharge/filesystem package providing convenient file system utilities. Methods in the @supercharge/filesystem package are async by default and don’t block the event loop.

You may use the exists method to check if a file path exists on your disk:

const Path = require('path')  
const Fs = require('@supercharge/filesystem')

const path = Path.join(__dirname, "existing-file.txt")

await Fs.exists(path)  
// true


Mentioned Resources

Explore the Library

Find interesting tutorials and solutions for your problems.