How to get all files in directory in Node.js [Practical Examples]


NodeJS

Author: Steve Alila
Reviewer: Deepak Prasad

Node.js get all files in directory is possible with readdir() method of the fs module.

fs.readdir(<file path>, <callback function>)

The file path represents the path of the directory executing the file. The callback function returns an error or an array of files. You can catch the error. Or loop through the files array and print them.

The fs module implements both asynchronous and synchronous file handling options. As a result, you can also Node.js get all files in directory using the readdirSync() method. However, this time around, you do not include a callback function.

Apart from the fs module, you can Node.js get all files in directory using the child_process module or third-party packages.

This tutorial walks you through Node.js get all files in directory using the fs and child_process modules. Read on to learn more.

 

Setup Lab Environment

Let's build a directory with a directory and files. Head over to your terminal and create a directory called target_dir and cd into it.

mkdir target_dir
cd target_dir

Create one directory and three files.

mkdir child_dir
touch file.py file1.js file2.c

I have created a directory called child_dir and three files: file.py, file1.js, and file2.c.

Let's get the files now.

 

The most familiar way to Node.js get all files in directory is to use the fs (file system) module with methods like readdir() and readdirSync().

 

Method-1: Use the readdir() method

You can asynchronously list files in a directory using the readdir() method. What we mean by asynchronous file listing is that the process occurs at irregular intervals.

Here are the steps to use the readdir() method.

 

Step-1: Import the fs and path modules

We will use the fs module to read the target_dir's content. And the path module to join the target_dir to the __dirname.  The __dirname is an environment variable specifying the absolute path of the directory executing the file.

Create index.js entry file in the same directory as the target_dir using a code editor. I am using vim for these demos.

cd ..
vim index.js

and import the modules in it.

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

 

Step-2: Join the target directory to the __dirname

Let's join the target_dir to the __dirname using the path module's join()method.

const fullPath = path.join(__dirname, 'target_dir')

I have created a variable called fullPath.

 

Step-3: Read the target directory's files

Let's read the target_dir's files.

fs.readdir(fullPath, (error, files) => {
if (error) console.log(error)
files.forEach( file => console.log(file))
})

The fs.readdir() takes the full path and callback function with the error and files parameters.

If the Node.js get all files in directory mission fails, we print the error. Otherwise, we loop through the array of files using the forEach() method and print each file.

 

Step-4: Execute the entry file

Save the index.js file's contents and return to the terminal.

How to get all files in directory in Node.js [Practical Examples]

Lastly, run the file using the node command.

node index.js

You should get the following output.

user@hostname:-$ node index.js
child_dir
file.py
file1.js
file2.c

Node.js get all files in directory

 

Method-2: Use the readdirSync() method

We can also synchronously get all files in the target_dir directory using the readdirSync() method.

This time around, we will not use a callback function. Instead, we will read the directory contents in a try block and catch the errors in the catch block.

Update the index.js file with the following content.

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

const fullPath = path.join(__dirname, 'target_dir')
const files = fs.readdirSync(fullPath)

try { files.forEach( file => console.log(file) ) }
catch (error) { console.log(error) }

How to get all files in directory in Node.js [Practical Examples]

Save the file, then return to the terminal and run it with the node command.

node index.js

You should have a similar output as previously.

user@hostname:-$ node index.js
child_dir
file.py
file1.js
file2.c

 

Node.js get all files in directory using the child_process module

You can get all files in a directory using the child_process module's exec() function. The exec function starts a new process that runs on the shell. That enables you to execute GNU commands like ls and cat in your code.

The function returns two objects: stderr and stdout. The stderr prints any error that could arise while running the given file, while the stdout object contains the returned data.

Here is how we can use the two objects to Node.js get all files in directory.

 

Option-1: Use a callback function

Open the entry index.js file and import the exec function from the child_process module.

const { exec } = require('child_process')

Then, run the function with the ls command on the target_dir and a callback function.

exec('ls target_dir', (error, stdout, stderr) => {
if (error) console.log(error)
console.log(stdout)
})

The callback function's first parameter is the error object that (almost) all Node.js callback functions return. While the stdout and stderr parameters represent the exec()function's stdout and stderr objects, respectively.

We could print the stderr object returned from the exec function. But we are already catching errors with the callback function's error object.

Lastly, we print the returned stdout data.

How to get all files in directory in Node.js [Practical Examples]

Save and run the file with the node command.

node index.js

You should get an output similar to mine.

user@hostname:-$ node index.js
child_dir
file1.js
file2.c
file.py

How to get all files in directory in Node.js [Practical Examples]

The best reason to use the exec function is that it empowers you to pipe commands till you get the desired output.

For example, we can get all files excluding directories using the command: ls -p | grep -v /.

exec('ls -p target_dir | grep -v /', (error, stdout, stderr) => {
if (error) console.log(error)
console.log(stdout)
})

We update the exec function to run the ls command, whose output is piped into the grep command for further search.

How to get all files in directory in Node.js [Practical Examples]

Running the file,

node index.js

you get an output similar to mine.

user@hostname:-$ node index.js
file1.js
file2.c
file.py

This time around, the system does not print the child_dir directory.

How to get all files in directory in Node.js [Practical Examples]

Apart from the callback function, you can use the promises.

 

Option-2: Use async-await

Open the entry file and import the exec() and promisify() functions from the child_process and the util modules, respectively.

const { exec } = require('child_process')
const { promisify } = require('util')

Convert the exec() function into a promise using the promisify() function.

const toExecute = promisify(exec)

And Node.js get all files in directory using async-await.

const execute = async () => {
const { stdout } = await toExecute("ls target_dir")
console.log(stdout)
}
execute()

How to get all files in directory in Node.js [Practical Examples]

Running the file,

node index.js

you get the files in the target directory.

How to get all files in directory in Node.js [Practical Examples]

The downside of using the child_process module is that some Unix commands may not run on your system, especially if you run the file on a Windows machine.

For example, the ls command is not recognized in Windows.

How to get all files in directory in Node.js [Practical Examples]

The solution is to use the corresponding Windows dir command, the fs module, or a third-party package like the glob module.

 

Conclusion

Node.js get all files in directory is straightforward after understanding synchronous and asynchronous directory reading using the fs, child_process, and the util modules, as explained in this tutorial. Besides, you can recursively get all files using the glob module.

 

Steve Alila

Steve Alila

He specializes in web design, WordPress development, and data analysis, with proficiency in Python, JavaScript, and data extraction tools. Additionally, he excels in web API development, AI integration, and data presentation using Matplotlib and Plotly. You can connect with him on his LinkedIn profile.

Can't find what you're searching for? Let us assist you.

Enter your query below, and we'll provide instant results tailored to your needs.

If my articles on GoLinuxCloud has helped you, kindly consider buying me a coffee as a token of appreciation.

Buy GoLinuxCloud a Coffee

For any other feedbacks or questions you can send mail to admin@golinuxcloud.com

Thank You for your support!!

Leave a Comment