fs 模块
fs 模块是 Node.js 的核心模块之一,用于与文件系统进行交互。它提供了多种方法来处理文件和目录,包括读取、写入、删除、重命名、监视文件变化等。fs 模块支持同步和异步操作,以满足不同的使用需求。
本文将介绍 fs 模块的常用方法,包括写入文件、读取文件、文件移动与重命名、删除文件、文件夹操作、监视文件变化等。
写入文件
文件写入通俗来说就是将数据写入到文件中,fs 模块提供了同步和异步写入的方法。
writeFile 异步写入文件
fs.writeFile 方法的基本语法如下:
fs.writeFile(path, data, [options], callback);
path:要写入的文件路径,可以是相对路径或绝对路径,必填参数。data:要写入文件的内容,可以是字符串或 Buffer,必填参数。options:包含编码、文件模式和标志等,可选参数。callback:写入完成后的回调函数,接受一个错误参数(err),如果写入成功则该参数为null,必填参数。
示例代码:
-
写入字符串到文件
const fs = require('fs');
fs.writeFile('example.txt', 'Hello, Node.js!', (err) => {
if (err) throw err;
console.log('File has been saved!');
}); -
写入 Buffer 到文件
const fs = require('fs');
const buffer = Buffer.from('Hello, Buffer!');
fs.writeFile('example.txt', buffer, (err) => {
if (err) throw err;
console.log('Buffer has been saved!');
}); -
Options 参数使用
const fs = require('fs');
const options = {
encoding: 'utf8',
mode: 0o666,
flag: 'w',
};
fs.writeFile('example.txt', 'Hello, Node.js!', options, (err) => {
if (err) throw err;
console.log('File has been saved!');
});选项参数详解:
encoding:指定写入文件的字符编码,默认使用utf8编码。mode:指定文件的权限模式,默认使用0o666权限。flag:指定文件打开模式,默认使用w打开文件,可选值有:r:以只读模式打开文件,如果文件不存在则抛出异常。r+:以读写模式打开文件,如果文件不存在则抛出异常。w:以写入模式打开文件,如果文件不存在则创建文件。wx:以写入模式打开文件,如果文件存在则抛出异常。w+:以读写模式打开文件,如果文件不存在则创建文件。wx+:以读写模式打开文件,如果文件存在则抛出异常。a:以追加模式打开文件,如果文件不存在则创建文件。ax:以追加模式打开文件,如果文件存在则抛出异常。a+:以读写模式打开文件,如果文件不存在则创建文件。ax+:以读写模式打开文件,如果文件存在则抛出异常。
fs.writeFile 是 Node.js 中用于异步写入文件的常用方法,具有非阻塞特点,适合在高并发环境中使用。
writeFileSync 同步写入文件
fs.writeFileSync 方法的基本语法如下:
fs.writeFileSync(path, data, [options]);
path:要写入的文件路径,可以是相对路径或绝对路径,必填参数。data:要写入文件的内容,可以是字符串或 Buffer,必填参数。options:包含编码、文件模式和标志等,可选参数。
其参数上与 fs.writeFile 相比没有回调函数,是同步方法,调用后会等待写入完成,待写入完成后才会继续执行后续代码。
示例代码:
-
写入字符串到文件
const fs = require('fs');
fs.writeFileSync('example.txt', 'Hello, Node.js!');
console.log('File has been saved!'); -
写入 Buffer 到文件
const fs = require('fs');
const buffer = Buffer.from('Hello, Buffer!');
fs.writeFileSync('example.txt', buffer);
console.log('Buffer has been saved!');与异步写入文件不同,同步写入文件会阻塞 Node.js 进程,直到写入完成,因此不适合在高并发环境中使用。
fs.writeFileSync 是 Node.js 中用于同步写入文件的常用方法,具有阻塞特点,适合在单线程环境中使用。
appendFile / appendFileSync 追加写入
appendFile 作用是在文件尾部追加内容,只是追加模式下,如果文件不存在则创建文件。
语法和参数与 writeFile 和 writeFileSync 完全相同:
fs.appendFile(path, data, [options], callback);
fs.appendFileSync(path, data, [options]);
示例代码:
const fs = require('fs');
fs.appendFile('example.txt', 'Hello, Node.js!', (err) => {
if (err) throw err;
console.log('File has been saved!');
});
const fs = require('fs');
fs.appendFileSync('example.txt', 'Hello, Node.js!');
console.log('File has been saved!');
上述两段代码的作用是将字符串 "Hello, Node.js!" 追加到文件 example.txt 的末尾。
createWriteStream 流式写入
程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数,提高效率。
流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景
fs.createWriteStream 方法的基本语法如下:
fs.createWriteStream(path, [options]);
path:要写入的文件路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。
示例代码:
const fs = require('fs');
const writeStream = fs.createWriteStream('example.txt');
writeStream.write('Hello, Node.js!');
writeStream.write('Hello, Node.js!');
writeStream.write('Hello, Node.js!');
writeStream.end();
上述代码创建了一个流式写入对象,并写入了三次 "Hello, Node.js!" 到文件 example.txt 中。
应用场景
- 日志文件写入:日志文件是系统运行过程中的重要记录,一般需要写入频繁,因此使用流式写入或追加写入更加合适。
- 数据文件写入:数据文件一般都是小文件,写入频率较低,使用同步写入更加合适。
- 配置文件写入:配置文件一般都是小文件,写入频率较低,使用同步写入更加合适。
- 缓存文件写入:缓存文件一般都是大文件,写入频率较高,使用流式写入或追加写入更加合适。
当 需要持久化保存数据 的时候,应该想到 文件写入
读取文件
文件读取通俗来说就是从文件中读取数据,fs 模块提供了同步和异步读取的方法。
readFile 异步读取文件
fs.readFile 方法的基本语法如下:
fs.readFile(path, [options], callback);
path:要读取的文件路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。callback:读取完成后的回调函数,接受两个参数:err:如果读取失败,则该参数为错误对象,否则为null。data:读取到的内容,如果读取失败,则该参数为undefined。
示例代码:
const fs = require('fs');
fs.readFile('example.txt', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
readFileSync 同步读取文件
fs.readFileSync 方法的基本语法如下:
fs.readFileSync(path, [options]);
path:要读取的文件路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。
其参数上与 fs.readFile 相比没有回调函数,是同步方法,调用后会等待读取完成,待读取完成后才会返回读取到的内容。
示例代码:
const fs = require('fs');
const data = fs.readFileSync('example.txt');
console.log(data.toString());
createReadStream 流式读取
fs.createReadStream 方法的基本语法如下:
fs.createReadStream(path, [options]);
path:要读取的文件路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。
示例代码:
const fs = require('fs');
const readStream = fs.createReadStream('example.txt');
readStream.on('data', (chunk) => {
console.log(chunk.toString());
});
readStream.on('end', () => {
console.log('End of file');
});
上述代码创建了一个流式读取对象,并监听了数据和结束事件,打印了文件内容。
应用场景
- 日志文件读取:日志文件是系统运行过程中的重要记录,一般需要读取频繁,因此使用流式读取更加合适。
- 数据文件读取:数据文件一般都是小文件,读取频率较低,使用同步读取更加合适。
- 配置文件读取:配置文件一般都是小文件,读取频率较低,使用同步读取更加合适。
- 缓存文件读取:缓存文件一般都是大文件,读取频率较高,使用流式读取更加合适。
文件移动与重命名
文件移动与重命名是文件操作的常用功能,fs 模块提供了 rename 和 renameSync 方法来实现文件移动与重命名。
rename 异步移动文件
fs.rename 方法的基本语法如下:
fs.rename(oldPath, newPath, callback);
oldPath:要移动的文件的当前路径,可以是相对路径或绝对路径,必填参数。newPath:要移动或重命名的文件的新路径,可以是相对路径或绝对路径,必填参数。callback:移动或重命名完成后的回调函数,接受一个错误参数(err),如果移动或重命名成功则该参数为null,必填参数。
示例代码:
const fs = require('fs');
fs.rename('example.txt', 'example-new.txt', (err) => {
if (err) throw err;
console.log('File has been renamed!');
});
renameSync 同步移动文件
fs.renameSync 方法的基本语法如下:
fs.renameSync(oldPath, newPath);
oldPath:要移动的文件的当前路径,可以是相对路径或绝对路径,必填参数。newPath:要移动或重命名的文件的新路径,可以是相对路径或绝对路径,必填参数。
其参数上与 fs.rename 相比没有回调函数,是同步方法,调用后会等待移动或重命名完成,待移动或重命名完成后才会继续执行后续代码。
示例代码:
const fs = require('fs');
fs.renameSync('example.txt', 'example-new.txt');
console.log('File has been renamed!');
文件删除
文件删除是文件操作的常用功能,fs 模块提供了 unlink 和 unlinkSync 方法来实现文件删除。
unlink 异步删除文件
fs.unlink 方法的基本语法如下:
fs.unlink(path, callback);
path:要删除的文件路径,可以是相对路径或绝对路径,必填参数。callback:删除完成后的回调函数,接受一个错误参数(err),如果删除成功则该参数为null,必填参数。
示例代码:
const fs = require('fs');
fs.unlink('example.txt', (err) => {
if (err) throw err;
console.log('File has been deleted!');
});
unlinkSync 同步删除文件
fs.unlinkSync 方法的基本语法如下:
fs.unlinkSync(path);
path:要删除的文件路径,可以是相对路径或绝对路径,必填参数。
其参数上与 fs.unlink 相比没有回调函数,是同步方法,调用后会等待删除完成,待删除完成后才会继续执行后续代码。
示例代码:
const fs = require('fs');
fs.unlinkSync('example.txt');
console.log('File has been deleted!');
文件夹操作
文件夹操作是文件操作的常用功能,包括创建文件夹、删除文件夹、列出文件夹内容等,fs 模块提供了 mkdir 和 mkdirSync 方法来实现文件夹创建,readdir 和 readdirSync 方法来实现列出文件夹内容,rmdir 和 rmdirSync 方法来实现文件夹删除。
mkdir 异步创建文件夹
fs.mkdir 方法的基本语法如下:
fs.mkdir(path, [options], callback);
path:要创建的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含权限模式等,可选参数。recursive:是否递归创建,默认为false。
callback:创建完成后的回调函数,接受一个错误参数(err),如果创建成功则该参数为null,必填参数。
示例代码:
const fs = require('fs');
fs.mkdir('example', (err) => {
if (err) throw err;
console.log('Folder has been created!');
});
// 递归创建文件夹
fs.mkdir('example2/sub', { recursive: true }, (err) => {
if (err) throw err;
console.log('Folder2 has been created!');
});
mkdirSync 同步创建文件夹
fs.mkdirSync 方法的基本语法如下:
fs.mkdirSync(path, [options]);
path:要创建的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含权限模式等,可选参数。recursive:是否递归创建,默认为false。
其参数上与 fs.mkdir 相比没有回调函数,是同步方法,调用后会等待创建完成,待创建完成后才会继续执行后续代码。
示例代码:
const fs = require('fs');
fs.mkdirSync('example');
console.log('Folder has been created!');
// 递归创建文件夹
fs.mkdirSync('example2/sub', { recursive: true });
console.log('Folder2 has been created!');
readdir 异步列出文件夹内容
fs.readdir 方法的基本语法如下:
fs.readdir(path, [options], callback);
path:要列出的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。callback:列出完成后的回调函数,接受两个参数:err:如果列出失败,则该参数为错误对象,否则为null。files:列出的文件名数组,如果列出失败,则该参数为undefined。
示例代码:
const fs = require('fs');
fs.readdir('example', (err, files) => {
if (err) throw err;
console.log(files);
});
readdirSync 同步列出文件夹内容
fs.readdirSync 方法的基本语法如下:
fs.readdirSync(path, [options]);
path:要列出的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。
其参数上与 fs.readdir 相比没有回调函数,是同步方法,调用后会等待列出完成,待列出完成后才会返回文件名数组。
示例代码:
const fs = require('fs');
const files = fs.readdirSync('example');
console.log(files);
rmdir 异步删除文件夹
fs.rmdir 方法的基本语法如下:
fs.rmdir(path, [options], callback);
path:要删除的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。recursive:是否递归删除,默认为false。
callback:删除完成后的回调函数,接受一个错误参数(err),如果删除成功则该参数为null,必填参数。
示例代码:
const fs = require('fs');
fs.rmdir('example', (err) => {
if (err) throw err;
console.log('Folder has been deleted!');
});
// 递归删除文件夹
fs.rmdir('example2/sub', { recursive: true }, (err) => {
if (err) throw err;
console.log('Folder2 has been deleted!');
});
rmdirSync 同步删除文件夹
fs.rmdirSync 方法的基本语法如下:
fs.rmdirSync(path, [options]);
path:要删除的文件夹路径,可以是相对路径或绝对路径,必填参数。options:包含编码、文件模式和标志等,可选参数。recursive:是否递归删除,默认为false。
其参数上与 fs.rmdir 相比没有回调函数,是同步方法,调用后会等待删除完成,待删除完成后才会继续执行后续代码。
示例代码:
const fs = require('fs');
fs.rmdirSync('example');
console.log('Folder has been deleted!');
// 递归删除文件夹
fs.rmdirSync('example2/sub', { recursive: true });
console.log('Folder2 has been deleted!');
查看资源状态
查看资源状态是文件操作的常用功能,fs 模块提供了 stat 和 statSync 方法来实现查看资源状态。
stat 异步查看资源状态
fs.stat 方法的基本语法如下:
fs.stat(path, callback);
path:要查看的文件或文件夹路径,可以是相对路径或绝对路径,必填参数。callback:查看完成后的回调函数,接受两个参数:err:如果查看失败,则该参数为错误对象,否则为null。stats:资源状态对象,包含以下属性:isFile():是否为文件。isDirectory():是否为文件夹。isBlockDevice():是否为块设备。isCharacterDevice():是否为字符设备。isSymbolicLink():是否为符号链接。isFIFO():是否为命名管道。isSocket():是否为套接字。size:文件大小(字节)。mode:文件权限模式。atime:上次访问时间。mtime:上次修改时间。ctime:创建时间。
示例代码:
const fs = require('fs');
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(stats);
});
statSync 同步查看资源状态
fs.statSync 方法的基本语法如下:
fs.statSync(path);
path:要查看的文件或文件夹路径,可以是相对路径或绝对路径,必填参数。
其参数上与 fs.stat 相比没有回调函数,是同步方法,调用后会等待查看完成,待查看完成后才会返回资源状态对象。
示例代码:
const fs = require('fs');
const stats = fs.statSync('example.txt');
console.log(stats);