Node.js之文件处理

1,604 阅读11分钟

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:一个对象,包含一些可选的选项,如flagsencodingfdmode等。 返回值:
  • 一个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()方法创建了一个可写流对象,并传入了一些选项,如flagsencodingfd等。这里的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 选项表示是否递归创建目录,默认为 falsemode 选项表示创建新目录时的权限,默认为 0o777
  • callback:回调函数,用于处理创建目录的操作结果。回调函数有两个参数:err 和 dirStats。其中,err 是一个错误对象,如果创建目录操作成功,则该参数为 nulldirStats 是一个文件统计对象,包含有关目录的信息,例如大小、权限等。

以下是一个简单的示例,展示如何使用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 是一个错误对象,如果读取目录操作成功,则该参数为 nullfiles 是一个包含目录下所有文件和子目录的文件名数组。

示例:

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选项表示是否强制删除,默认为 falsemaxRetries选项表示在删除目录时的最大重试次数,默认为 Infinity
  • callback:回调函数,用于处理删除操作的结果。回调函数有两个参数:err 和 pathObj。其中,err 是一个错误对象,如果删除操作成功,则该参数为 nullpathObj 是一个包含路径信息的对象,包含路径、元数据等信息。

示例:

fs.rm('./html',{recursive: true},err =>{
    if(err){
        console.log('删除失败');
        return ;
    }
    console.log('删除成功');
});