2. node 之 fs 模块

127 阅读4分钟

一、fs 定义

fs 模块为 nodejs 的核心模块之一,主要处理文件的读写、复制、s删除、重命名等操作。当需要使用该模块时,需要先导入该文件。 主要记录读、写文件内容。

var fs = require('fs');

当前示例的文件路径如下截图:

image.png

二、fs.readFile() 读取指定文件内容

fs.readFile(path[,options],callback) 表示用来读取指定文件中的内容,传 3 个参数

  1. path: 必填项,'传字符串', 填写我们要读取的文件路径
  2. options: 可选项,表示以什么样的编码格式来读取文本,不传默认使用 utf8 来编译。
  3. callback: 必填项,文件读取完成之后,通过此回调函数拿到读取结果 (回调函数需有俩个形参:(err , data)分别表示读取失败和读取成功

readFile 回调函数有 2 个值,err 和 data ,err 表示读取文件失败,data 表示读取文件成功的内容。 如果读取成功,err 返回 null。反之如果读取失败,err 返回失败的数据信息。

const fs = require("fs");

fs.readFile('./file/1.txt', 'utf8', (err, data) => {
    err ?  console.log('读取失败') : console.log(data.toString(), '读取成功')
})

三、fs.write() 向指定文件中写入内容

1. fs.write() 示例:

使用 fs.writeFile(path, data, [options], callback) 方法,可以向指定的文件中写入内容。传 4 个参数, 语法格式如下:

1.path: 必选参数,表示需要指定一个文件路径的字符串,表示文件的存放路径。
2.data: 必选参数,表示要写入的内容, 必须是字符串类型或 Buffer 的实例
3. options: 可选参数,表示以什么格式写入文件内容。默认为 utf8.
4. callback: 必选参数,文件写入完成后的回调函数。

const fs = require("fs");

fs.writeFile('./file/2.txt','加油哇', (err) => {
    err ? console.log('写入失败') : console.log('写入成功')
})

2. fs.write() 注意项

  1. fs.write() 方法只能用来创建文件,不能用来创建目录。所以我们在用它创建文件的时候,要提前把它所要旋转的目录创建好。

  2. 重新调用 fs.write() 写入同一个文件,新写入的内容会覆蓋之前的旧内容。

三、读写文件内容应用

使用 fs 文件系统模块,将【素材】目录下的 【成绩.txt】文件中的考试数据,整理到 file 目录下的 【成绩-ok.txt】文件中。

目录如下截图:

image.png

【素材】目录下的 【成绩.txt】内容如下:

小红=100 小明=90 小果=100 小新=88

整理完成之后 ,希望得到的 【成绩-ok.txt】文件中的数据格式如下:

小红=100
小明=90
小果=100
小新=88

代码如下:

const fs = require("fs");

// 成绩处理读取处理写入
fs.readFile("./素材/成绩.txt", "utf8", (err, data) => {
  let fileContent = "";
  if (err) {
    console.log("读取失败");
  } else {
    fileContent = data;
  }

  // 把字符串转化成数组
  let fileArr = fileContent.split(" ");
  //  得到每一项类似 【小红:100】这样的元素组成的数组
  let fileNewArr = fileArr.map((ele) => {
    return ele.replace("=", ":");
  });
  // 把数组转换成换行的字符串
  let dataStr = fileArr.join("\r\n");

  fs.writeFile("./file/成绩-ok.txt", dataStr, (err) => {
    err ? console.log("写入失败") : console.log("写入成功");
  });
});

四、文件路径问题

1. 文件路径问题

文件路径问题:
在使用 fs 模块操作文件时,**如果 提供的操作路径是以 **【./】或 【../】开头的相对路径时,很容易出现路径动态拼接错误的问题

问题原因代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径

解决方案: 在使用 fs 模块操作文件时,直接提供完整的路径,不要以【./】或 【../】开头的相对路径,从而防止路径动态拼接的问题。

解决方法:如下 2 种方法。
1. 从盘符开始使用完整的路径,缺点不易维护、移植性非常差。
2. 使用 __dirname双下划线加 dirname】来,它表示当前文件所处的目录。

2. 文件路径问题重现

我们在要读取的文件的上一层或其他层执行 node 的命令

之前我们是在如下路径下直接执行 node 命令:

image.png 现在我们在 在一层 进行执行

image.png

const fs = require('fs')

fs.readFile('./file/2.txt', (err, data) => {
    err ? console.log(err.message, '读取失败') : console.log('读取成功')
})

执行命令后发现,返回错误,因为代码在运行的时候,会以执行 node 命令时所处的目录,而当前 node 命令所处的目录下没有 对应的要执行 index.js 文件。

image.png

3. 解決方法一:从盘符开始使用完整的路径

从盘符开始使用完整的路径, 需要用【\】,防止转义,缺点不易维护、移植性非常差

const fs = require('fs')

fs.readFile('C:\\workspace\\other\\node\\file\\2.txt', (err, data) => {
    err ? console.log(err.message, '读取失败') : console.log('读取成功')
})

4. 解決方法二:使用 __dirname 【双下划线加dirname】

使用 __dirname 【双下划线加dirname】来,它表示当前文件所处的目录

const fs = require('fs')

fs.readFile(`${__dirname}/file/2.txt`, (err, data) => {
    err ? console.log(err.message, '读取失败') : console.log('读取成功')
})