Recursively List All the Files in a Directory Using Node.js
How do you recursively get a list of all the files in a directory using Node.js?
Node.js has a built-in Fs core module that provides an fs.readdirSync()
function that reads the contents of a directory at a given file path.
In this article, we'll show you both a basic example of how to use the fs.readdirSync()
function and also how to use it in a more advanced way to recursively go through each subdirectory and get each of their files as well.
To get the code in this article to work, make sure you have Node.js installed on your local machine.
If you need one, we created a guide on installing Node.js.
Let's get started!
Table of Contents
Basic Usage of fs.readdirSync()
Before we create the recursive solution, let's go over a simple example using the fs.readdirSync()
function.
The fs.readdirSync()
function takes a directory path and a callback function for arguments. And it returns an array of the files as a relative path to the directory you passed as a parameter.
Here's what it looks like in practice, assuming you have a directory named my-directory
with files in it:
const fs = require("fs")
try {
const arrayOfFiles = fs.readdirSync("./my-directory")
console.log(arrayOfFiles)
} catch(e) {
console.log(e)
}
Let's go over what's happening in the code.
First of all, we require()
the fs
module. Since it's a core module, we don't need to install anything and can use it right away.
Since fs.readdirSync()
is a synchronous function, we wrap our code in a try...catch
statement to help manage our code and catch any errors that might occur.
Inside the try
section, we pass a path to a directory named my-directory
to the fs.readdirSync()
function and hold it in a variable called arrayOfFiles
.
When that variable is logged, you'll have an array of relative file paths to each file and subdirectory inside the directory.
The output will look similar to this:
["example.txt", "sub-directory"]
What if our directory has sub-directories that have files we want to include in our list?
In the next section, we'll show you how to get those as well.
Get All the Files in the Directory
In this section, we'll show you how to recursively get all the files in a directory (even those located in a subdirectory).
To do this, we need to create a recursive function that can call itself when dealing with sub-directories. And we also need the function to go through each of the sub-directories and add any new files it encounters. When the function is finished, it should return an array with all the files it encountered.
Here's what the recursive function looks like:
const fs = require("fs")
const path = require("path")
const getAllFiles = function(dirPath, arrayOfFiles) {
files = fs.readdirSync(dirPath)
arrayOfFiles = arrayOfFiles || []
files.forEach(function(file) {
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles)
} else {
arrayOfFiles.push(path.join(__dirname, dirPath, "/", file))
}
})
return arrayOfFiles
}
Let's go over each part of the code.
First, we require()
the Node.js path
module. Since this is included with Node.js, you don't need to install anything for it to work. This module will help us easily create full file paths for our files.
The getAllFiles
variable holds the recursive function that will go through each subdirectory and return an array of filenames. It takes a directory file path and an optional arrayOfFiles
as arguments.
Inside the getAllFiles
function, we first use the readdirSync()
function to get all of the files and directories inside the given dirPath
supplied to the function.
Then, we create an arrayOfFiles
that will hold all the filenames that will be returned when the function is done running.
Next, we loop over each item (file or directory) found by the readdirSync()
function. If the item is a directory, we have the function recursively call itself to get all of the files and sub-directories inside the given directory.
And if the item is a file, we simply append the file path to the arrayOfFiles
array.
When the forEach
loop has finished, we return the arrayOfFiles
array.
Here is how you use the function in your code:
const result = getAllFiles("PATH_TO_PARENT_DIRECTORY")
// [ "FILE_PATH", "FILE_PATH", "FILE_PATH" ]
There you have it!
When you call the getAllFiles()
function, it'll return a list of all the files.