FS Module
fs is a node.js module providing access to the file system.
Opening Files
Function open from fs allows to open file from file system.
It has signature:
function open(
path: PathLike,
flags: OpenMode,
callback: (err: NodeJS.ErrnoException | null, fd: number) => void
): void;
| Flag | Description |
|---|---|
| r | Open file for read. Throws exception if file doesn’t exists. |
| r+ | Open file to read and write. Throws exception if file doesn’t exists. |
| rs+ | Open file in synchronous mode to read and write. |
| w | Open file for writing. File is created if it doesn’t exists. |
| wx | It is same as ‘w’ but fails if path exists. |
| w+ | Open file to read and write. File is created if it doesn’t exists. |
| wx+ | It is same as ‘w+’ but fails if path exists. |
| a | Open file to append. File is created if it doesn’t exists. |
| ax | It is same as ‘a’ but fails if path exists. |
| a+ | Open file for reading and appending. File is created if it doesn’t exists. |
| ax+ | It is same as ‘a+’ but fails if path exists. |
If file does not exist, it will be created.
Creating Files
To create new file and write data to it fs.write() is used:
function write<TBuffer extends NodeJS.ArrayBufferView>(
fd: number,
buffer: TBuffer,
offset: number | undefined | null,
length: number | undefined | null,
position: number | undefined | null,
callback: (err: NodeJS.ErrnoException | null, written: number, buffer: TBuffer) => void
): void;
Example:
function writeContentToFile(
path: PathLike,
content: string
): Promise<void> {
return new Promise((resolve, reject) => {
// open file in write mode
fs.open(path, "w", (err, fd) => {
if (err) {
console.error(err);
reject(err);
}
// write content into opened file
fs.write(fd, content, (err, numberWritten, str) => {
if (err) {
console.error(err);
reject(err);
}
console.log(`number written: ${numberWritten}, str: ${str}`);
resolve();
});
});
});
}
There is a simpler way to write file - fs.writeFile():
fs.writeFile( path, content, { encoding: "utf-8" }, (err) => {
console.error(err);
}
);
writeFile has signature:
function writeFile(
file: PathOrFileDescriptor,
data: string | NodeJS.ArrayBufferView,
options: WriteFileOptions,
callback: NoParamCallback
): void;
To append some data to an existing file or create new if file does not exist there is a method fs.appendFile()
with following signature:
function appendFile(
path: PathOrFileDescriptor,
data: string | Uint8Array,
options: WriteFileOptions,
callback: NoParamCallback
): void
where callback is of signature:
(err: NodeJS.ErrnoException | null) => void
In case of any error object err of the callback will contain error of type:
interface ErrnoException extends Error {
errno?: number | undefined
code?: string | undefined
path?: string | undefined
syscall?: string | undefined
}
Removing Files
To remove file from file system use fs.unlink:
fs.unlink(path, (err) => {
if (err) {
console.log('File deleted!');
}
});
Files Metadata
To get file metadata use:
function stat(
path: PathLike,
callback: (err: NodeJS.ErrnoException | null, stats: Stats) => void
): void;
Stats object contains:
isFile(): booleanisDirectory(): booleanisBlockDevice(): booleanisCharacterDevice(): booleanisSymbolicLink(): booleanisFIFO(): booleanisSocket(): boolean
To rename files there is a fs.rename() function:
fs.rename(existingFilePath, newFileName, (err) => {
if (err) {
console.log('File Renamed!');
}
});
Stream API
Stream is a way to transfer data continuously. It is especially useful with large data, which could not be loaded into RAM otherwise.
node:fs module contains functions to operate streams over files.
To create read stream:
const stream = fs.createReadStream(filePath);
createReadStream has signature:
function createReadStream(
path: PathLike,
options?: BufferEncoding | ReadStreamOptions
): ReadStream;
To read data from create stream there is a data event, which should be listened:
stream.setEncoding("utf8");
stream.on("data", (data: string | Buffer) => {
console.log(data);
});
To create write file stream there is a fs.createWriteStream() function:
const stream = fs.createWriteStream(path, {
encoding: "utf-8",
});
for (let x = 0; x < 100; x++) {
stream.write(`${x}\n`, (err) => {
console.error(err);
});
}
This example will write 100 lines with increasing numbers into file with path equal to path variable value.
Streams can be piped with other streams. For example we can create stream over http to download data and pipe it to file stream to immediately write this data to file. For example:
axios.get<Readable>(url, { responseType: "stream" })
.then(async (response) => {
const fileWriteStream = fs.createWriteStream('./local-file');
response.data.pipe(fileWriteStream);
})
.catch(error => console.error(error));
Plan
pathprocess.cwd()