fs模块用来实现与磁盘的交互,例如:文件的创建、删除、重命名、移动,文件内容的写入、读取,文件夹的相关操作。
一、fs模块写入文件
1、writeFile()方法
在Node.js中,fs模块的writeFile()方法用于将数据写入文件。其基本语法如下:
fs.writeFile(file, data, options, callback);
file:要写入数据的文件路径。如果文件不存在,将会被创建。可以是一个字符串或者一个Buffer对象。data:要写入文件的数据。可以是任何类型的值,通常是一个字符串或者一个Buffer对象。options(可选):一个包含选项的对象。目前只有一个选项,即flag,用于指定文件的打开方式。默认为'w'。callback(可选):写入完成后的回调函数。回调函数有两个参数:err(如果出现错误)和result(写入的结果)。
示例:
//导入fs模块
const fs = require('fs');
//写入文件
fs.writeFile('./座右铭.txt','三人行则必有我师焉',err => {
//err的值是错误对象,如果没有错误则err的值是null
if(err){
console.log('写入失败!');
return;
}
console.log('写入成功!');
});
2、writeFileSync()方法
在Node.js中,fs模块的writeFileSync()方法用于将数据写入文件,该方法是同步方法,
其基本语法如下:
fs.writeFileSync(file, data, options);
file:要写入数据的文件路径。如果文件不存在,将会被创建。可以是一个字符串或者一个Buffer对象。data:要写入文件的数据。可以是任何类型的值,通常是一个字符串或者一个Buffer对象。options(可选):一个包含选项的对象。目前只有一个选项,即flag,用于指定文件的打开方式。默认为'w'。
示例:
const fs = require('fs');
const data = '这是一个测试数据';
fs.writeFileSync('test.txt', data);
以上代码将一个字符串写入名为test.txt的文件中。如果文件不存在,将会被创建。
3、同步写入和异步写入
(1) 异步/同步行为:
writeFile()方法是一个异步方法,它接受一个回调函数作为参数,并在写入操作完成后调用该回调函数。因此,它可以在后台执行写入操作,而不会阻塞主线程。
writeFileSync()方法是一个同步方法,它在写入操作完成前会阻塞主线程,直到写入操作完成才会返回。因此,如果需要等待写入操作完成,可以使用该方法。
总结:writeFile()和writeFileSync()方法都是用于写入数据的,但writeFile()是异步方法,使用时需要传递回调函数,而writeFileSync()是同步方法,不需要传递回调函数,并在写入操作完成后立即返回。
(2) writeFile()和writeFileSync()的区别
fs模块中的writeFile()和writeFileSync()方法都用于将数据写入文件,但是它们在使用方式和异步/同步行为方面有所不同。
writeFile()方法需要提供一个回调函数作为参数,用于处理写入完成后的操作。使用时,需要将回调函数作为最后一个参数传递给writeFile()方法。
writeFile(file, data, options, callback);
writeFileSync()方法是一个同步方法,它在写入完成后不会立即返回,而是等待写入操作完成。因此,它不需要传递回调函数。
writeFileSync(file, data, options);
4、appendFile()方法
在Node.js的fs模块中,appendFile()方法是用于向文件追加数据的方法之一。其语法如下:
fs.appendFile(filename, data, options, callback)
参数说明:
filename:要追加数据的文件的路径。data:要追加到文件的数据。可以是字符串或可读流(Readable Stream)。options(可选):一个对象,包含一些可选的选项,如编码方式、文件权限等。callback(可选):追加完成后执行的回调函数。如果省略该参数,则将数据追加到文件后立即返回。
下面是一个使用appendFile()方法向文件追加数据的示例:
const fs = require('fs');
const filename = 'example.txt';
const data = 'Hello, World!';
fs.appendFile(filename, data, (err) => {
if (err) {
console.error(err);
return;
}
console.log('Data appended to file successfully.');
});
在Node.js的fs模块中,appendFileSync()方法是用于向文件同步追加数据的方法之一。它与appendFile()方法类似,但是是同步的,即它会阻塞代码执行,直到追加操作完成或发生错误。
下面是一个使用appendFileSync()方法向文件同步追加数据的示例:
const fs = require('fs');
const filename = 'example.txt';
const data = 'Hello, World!';
try {
fs.appendFileSync(filename, data);
console.log('Data appended to file successfully.');
} catch (err) {
console.error(err);
}
以上示例将字符串'Hello, World!'同步追加到名为example.txt的文件中。如果操作成功,会打印出一条消息表示成功。如果发生错误,将会打印错误信息。
5、createWriteStream()方法
流式写入打开一个数据流通道,写入完毕后再关闭,适合频繁写入。write()方法将数据逐块地写入到硬盘中,减少内存占用,适合处理大型文件。
在Node.js的fs模块中,createWriteStream()方法的语法如下:
const ws = fs.createWriteStream(options);
参数说明:
options:一个对象,包含一些可选的选项,如flags、encoding、fd和mode等。 返回值:- 一个Promise,返回一个可写流对象。
示例:
const fs = require('fs');
//创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt');
//写入
ws.write('半亩方塘一鉴开,\n');
ws.write('天光云影共徘徊。\n');
ws.write('问渠那得清如许?\n');
ws.write('为有源头活水来。\n');
//关闭流
ws.close();
示例2:
const fs = require('fs');
const writeStream = fs.createWriteStream({
flags: 'w',
encoding: 'utf8',
fd: fs.openSync('/path/to/file', 'w')
});
以上示例中,我们使用createWriteStream()方法创建了一个可写流对象,并传入了一些选项,如flags、encoding和fd等。这里的flags设置为'w',表示以覆盖方式写入文件;encoding设置为'utf8',表示使用UTF-8编码;fd设置为fs.openSync('/path/to/file', 'w'),表示打开文件并将其作为输出目标。
二、fs模块读取文件
1、readFile()方法
在Node.js的fs模块中,readFile()方法用于异步地读取文件内容。该方法的语法如下:
fs.readFile(path, options, callback);
其中,参数的含义如下:
path:要读取的文件路径,可以是字符串或Buffer对象。options:一个可选的对象,用于指定读取文件时的选项,例如编码方式、文件访问模式等。常见的选项包括:encoding:文件的编码方式,默认为null,表示以二进制方式读取文件。常用的编码方式包括'utf8'、'ascii'等。flag:文件的打开方式,默认为'r',表示以只读方式打开文件。其他可能的值包括'r+'表示读写模式,'w+'表示读写模式(如果文件已存在则清空文件内容),'a+'表示读写模式(如果文件不存在则创建文件)等。
callback:回调函数,用于处理读取操作完成后的事件。回调函数有两个参数:错误对象和读取到的文件内容。如果读取操作成功,则第一个参数为null,第二个参数为读取到的文件内容;如果发生错误,则第一个参数为错误对象,第二个参数为null。
示例:
const fs = require('fs');
//异步读取
fs.readFile('./观书有感.txt',(err,data)=>{
//err是错误信息,data是文件内容
if(err){
console.log('读取失败');
return ;
}
console.log(data.toString());
});
注意:读取的内容是Buffer对象,需要使用toString()方法转换成字符串。
2、createReadStream()方法
createReadStream是Node.js中fs模块提供的一个方法,用于创建一个可读流。可读流允许你从数据源(例如文件、网络连接等)读取数据,并将其传输到目的地(例如另一个文件、HTTP响应等)。
const readStream = fs.createReadStream(options);
其中,options是一个可选的参数,可以包含一些选项,例如文件路径、编码、缓冲大小等。如果未提供options参数,则默认为从标准输入流读取数据。
返回值是一个可读流对象,可以通过该对象的三个事件('data'、'end'和'error')来监听数据读取、流结束和错误的发生。
当从文件中读取一块数据后,触发data事件,执行回调函数,默认情况下一次读取65536字节=64kB
示例:
const fs = require('fs');
const readStream = fs.createReadStream('example.txt');
readStream.on('data', (chunk) => {
console.log(`读取 ${chunk.length} 字节的数据: ${chunk}`);
});
readStream.on('end', () => {
console.log('文件读取完成');
});
readStream.on('error', (err) => {
console.error(`读取文件时发生错误: ${err}`);
});
在上面的示例中,我们使用fs模块的createReadStream方法创建了一个可读流,并将其绑定到example.txt文件。然后,我们在数据事件上监听数据块,并在每个数据块到达时将其输出到控制台。当数据流结束时,我们输出“文件读取完成”消息,如果在读取文件时发生错误,则输出错误消息。
三、fs模块操作文件
1、移动与重命名文件
使用fs模块的rename方法移动并且重名名文件
fs.rename('/path/from/oldname.txt','/path/to/newname.txt',err =>{
if(err){
console.log("操作失败");
return ;
}
console.log('操作成功');
});
在上面的示例中,我们将 /path/from/oldname.txt 重命名为 /path/to/newname.txt。
- 第1个参数:当前文件或目录的路径(必选)。
- 第2个参数:新文件或目录的路径(必选)。
- 第3个参数:回调函数。
2、删除文件
(1)使用fs模块的unlink方法删除文件
const fs = require('fs');
fs.unlink('./座右铭2.txt',err =>{
if(err){
console.log('删除失败');
return ;
}
console.log('删除成功');
});
注:参数是需要删除的文件路径
(2)使用fs模块的rm方法删除文件
fs.rm('./座右铭3.txt',err => {
if(err){
console.log('删除失败');
return ;
}
console.log('删除成功');
});
注:参数是需要删除的文件路径,rm方法也可以删除目录,但是unlink方法不能删除目录
3、创建文件夹
fs.mkdir是Node.js中的一个方法,用于在文件系统中创建一个新的目录。它属于Node.js的内置模块fs(文件系统)模块,可以用来读取、写入和操作文件系统中的文件和目录。
fs.mkdir(path, options, callback);
path:要创建的目录的路径和名称。可以是字符串或Path对象。options:一个可选的对象,用于指定一些选项,如 recursive、mode 等。其中,recursive选项表示是否递归创建目录,默认为false。mode选项表示创建新目录时的权限,默认为0o777。callback:回调函数,用于处理创建目录的操作结果。回调函数有两个参数:err和dirStats。其中,err是一个错误对象,如果创建目录操作成功,则该参数为null;dirStats是一个文件统计对象,包含有关目录的信息,例如大小、权限等。
以下是一个简单的示例,展示如何使用fs.mkdir方法创建一个新目录:
const fs = require('fs');
fs.mkdir('my-new-directory', { recursive: true }, (err, dirStats) => {
if (err) {
console.error(err);
} else {
console.log('目录创建成功!');
console.log('目录大小:', dirStats.size);
}
});
在上面的示例中,我们使用fs.mkdir方法创建了一个名为my-new-directory的新目录,并设置了recursive选项为 true,表示递归创建目录(如果父级目录不存在)。在回调函数中,我们检查是否有错误,如果有则输出错误信息,否则输出成功信息和目录的大小。
4、读取文件夹
fs.readdir`是Node.js中用于读取目录内容的方法。其语法如下:
fs.readdir(path, options, callback);
path:要读取目录的路径和名称。可以是字符串或Path对象。options:一个可选的对象,用于指定一些选项,如 encoding、flag 等。其中,encoding选项表示读取文件名时的编码方式,默认为'utf8';flag选项表示读取目录时的标志,默认为'r'。callback:回调函数,用于处理读取目录的操作结果。回调函数有两个参数:err和files。其中,err是一个错误对象,如果读取目录操作成功,则该参数为null;files是一个包含目录下所有文件和子目录的文件名数组。
示例:
fs.readdir('../02_Node基础',(err,files) =>{
if(err){
console.log('读取失败');
return ;
}
console.log(files);
});
输出结果是一个文件名数组:
[
'html',
'座右铭3.txt',
'观书有感.txt',
'论语.txt'
]
5、删除文件夹
fs.rm是Node.js中的一个方法,用于在文件系统中删除文件或目录。它属于Node.js的内置模块fs(文件系统)模块,可以用来读取、写入和操作文件系统中的文件和目录。
以下是fs.rm方法的语法:
fs.rm(path, options, callback);
path:要删除的文件或目录的路径和名称。可以是字符串或Path对象。options:一个可选的对象,用于指定一些选项,如 force、maxRetries 等。其中,force选项表示是否强制删除,默认为false;maxRetries选项表示在删除目录时的最大重试次数,默认为Infinity。callback:回调函数,用于处理删除操作的结果。回调函数有两个参数:err和pathObj。其中,err是一个错误对象,如果删除操作成功,则该参数为null;pathObj是一个包含路径信息的对象,包含路径、元数据等信息。
示例:
fs.rm('./html',{recursive: true},err =>{
if(err){
console.log('删除失败');
return ;
}
console.log('删除成功');
});