Welcome to Day 5 of our Node.js blog series!
Today, we'll explore how to perform file system operations using the built-in fs
(file system) module. We'll cover reading from and writing to files, working with directories, and handling file metadata. Understanding file system operations is essential for developing applications that interact with the file system, such as reading configuration files, logging data, or managing file uploads.
The fs
Module
The fs
module provides an API for interacting with the file system in a manner closely modeled around standard POSIX functions. It offers both synchronous and asynchronous methods. While synchronous methods block the execution of the code until the operation completes, asynchronous methods are non-blocking and rely on callbacks, promises, or async/await syntax.
To use the fs
module, you need to require it in your Node.js application:
const fs = require('fs');
Reading Files
Asynchronous File Read:
The
fs.readFile
method reads the entire contents of a file asynchronously.Example:
const fs = require('fs'); fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error(err); return; } console.log(data); });
The callback function receives two arguments: an error object (
err
) and the file data (data
). If the operation fails,err
will contain the error details.
Synchronous File Read:
The
fs.readFileSync
method reads the entire contents of a file synchronously.Example:
const fs = require('fs'); try { const data = fs.readFileSync('example.txt', 'utf8'); console.log(data); } catch (err) { console.error(err); }
This method throws an error if the operation fails, which can be caught using a try-catch block.
Writing Files
Asynchronous File Write:
The
fs.writeFile
method writes data to a file asynchronously. If the file does not exist, it is created.Example:
const fs = require('fs'); const content = 'Hello, World!'; fs.writeFile('example.txt', content, 'utf8', (err) => { if (err) { console.error(err); return; } console.log('File has been saved!'); });
Synchronous File Write:
The
fs.writeFileSync
method writes data to a file synchronously.Example:
const fs = require('fs'); const content = 'Hello, World!'; try { fs.writeFileSync('example.txt', content, 'utf8'); console.log('File has been saved!'); } catch (err) { console.error(err); }
Working with Directories
Creating Directories:
The
fs.mkdir
method creates a new directory asynchronously.Example:
const fs = require('fs'); fs.mkdir('new-directory', { recursive: true }, (err) => { if (err) { console.error(err); return; } console.log('Directory created successfully!'); });
The
{ recursive: true }
option ensures that all parent directories are created if they do not exist.
Reading Directories:
The
fs.readdir
method reads the contents of a directory asynchronously.Example:
const fs = require('fs'); fs.readdir('.', (err, files) => { if (err) { console.error(err); return; } console.log('Directory contents:', files); });
Removing Directories:
The
fs.rmdir
method removes a directory asynchronously.Example:
const fs = require('fs'); fs.rmdir('new-directory', { recursive: true }, (err) => { if (err) { console.error(err); return; } console.log('Directory removed successfully!'); });
Handling File Metadata
Getting File Stats:
The
fs.stat
method retrieves file or directory metadata asynchronously.Example:
const fs = require('fs'); fs.stat('example.txt', (err, stats) => { if (err) { console.error(err); return; } console.log('File stats:', stats); });
The
stats
object contains information such as file size, creation time, modification time, and more.
Checking File or Directory Existence:
The
fs.existsSync
method checks if a file or directory exists synchronously.Example:
const fs = require('fs'); if (fs.existsSync('example.txt')) { console.log('File exists.'); } else { console.log('File does not exist.'); }
Watching Files and Directories
The fs.watch
method watches for changes in a file or directory, and triggers a callback when a change is detected.
Example:
const fs = require('fs'); fs.watch('example.txt', (eventType, filename) => { if (filename) { console.log(`File ${filename} has been ${eventType}`); } });
Streams
Streams are another important concept in Node.js for handling reading and writing of data. They provide a way to work with large data sets efficiently.
Reading Files Using Streams:
The
fs.createReadStream
method creates a readable stream for reading data from a file.Example:
const fs = require('fs'); const readStream = fs.createReadStream('example.txt', 'utf8'); readStream.on('data', (chunk) => { console.log('Chunk:', chunk); }); readStream.on('end', () => { console.log('No more data.'); }); readStream.on('error', (err) => { console.error(err); });
Writing Files Using Streams:
The
fs.createWriteStream
method creates a writable stream for writing data to a file.Example:
const fs = require('fs'); const writeStream = fs.createWriteStream('output.txt', 'utf8'); writeStream.write('Hello, '); writeStream.write('World!'); writeStream.end(); writeStream.on('finish', () => { console.log('File write completed.'); }); writeStream.on('error', (err) => { console.error(err); });
Conclusion
Today, we've explored file system operations in Node.js using the fs
module. We've covered reading from and writing to files, working with directories, handling file metadata, watching files and directories for changes, and using streams for efficient data handling. Mastering these operations is crucial for developing applications that interact with the file system.
In the next post, we'll delve into handling asynchronous operations in Node.js, covering callbacks, promises, and async/await. Stay tuned for more in-depth Node.js content!