nodejs学习笔记-02fs文件系统模块

147 阅读5分钟

1.什么是fs文件系统模块

fs模块是Node.js官方提供的,用来操作文件的模块,它提供了一系列的方法和属性,用来满足用户对文件的操作需求

例如:

  • fs.readFile() 方法,用来读取指定文件中的内容
  • fs.writeFile() 方法,用来指定文件中的写入内容

如果要在javascript代码中,使用fs模块来操作文件,则需要如下的方式先导入它:

const fs = require('fs')

2.读取指定文件中的内容

2.1 fs.readFile()的语法格式

使用fs.readFile() 方法,可以读取指定文件中的内容,语法格式如下

fs.readFile(path,[,options],callback)
// [,options]指可选参数
  • 参数1:必选参数.字符串,表示文件的路径
  • 参数2:可选参数,表示以什么编码格式来读取文件
  • 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果

2.2 示例: 以utf8的编码格式,读取指定文件的内容,并打印err和dataStr的值:

  1. 定义一个txt文件,随便写点东西

image.png

  1. 写一个简单的读取文件的js文件

image.png

  1. 在终端通过node环境运行该文件并查看读取结果

image.png

//1. 导入fs模块,来操作文件
const fs = require("fs");
// 调用fs.readFile()方法,读取文件
// 参数1:读取文件的存放路径
// 参数2:读取文件时采用的编码格式,默认指定utf8
// 参数3:回调函数,可以拿到读取失败和成功的结果 err dataStr
fs.readFile("./files/1.txt", "utf8", function (err, dataStr) {
  console.log(err); // 打印失败结果
  console.log("----------------");
  console.log(dataStr); // 打印成功结果
});

2.3判断文件是否读取成功

可以判断err对象是否为null,从而知晓文件读取结果: image.png

3.向指定的文件中写入内容

3.1 fs.writeFile()的语法格式

fs.writeFile(file,data,[,options],callback)
//[,options]指可选参数
  • 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
  • 参数2:必选参数,指定要写入的内容
  • 参数3:可选参数,表示以什么格式写入文件内容,默认值为utf8
  • 参数4:必选参数,文件写入完成后的回调函数

3.2示例:向指定的文件路径中,写入文件内容

  1. 编写一个写入文件内容的js文件

image.png 2. 在终端node环境运行该文件,并查看结果

注:测试失败方式-可以修改路径参数为一个不存在的路径,重新运行验证 image.png 3. 可以看到在files路径下生成了2.txt文件并写入了内容 image.png

// 1.导入fs模块
const fs = require("fs");

// 2.调用fs.writeFile()方法,写入文件内容
// 参数1:指定一个文件路径的字符串
// 参数2:指定要写入的内容
// 参数3:默认为utf8(一般可省略)
// 参数4:回调函数
fs.writeFile("./files/2.txt", "Hello,writeFile!", function (err) {
  console.log(err);
});

3.3判断文件是否写入成功

image.png

4.练习-考试成绩整理

使用fs文件系统模块,将素材目录下的成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中, 整理前的成绩.txt文件数据格式如下: image.png

整理后的成绩-ok.txt文件数据格式如下: image.png

4.1整理实现步骤

  1. 导入所需要操作文件的fs文件系统模块
  2. 使用fs.readFile()方法读取素材目录下的成绩.txt文件
  3. 判断文件读取结果,成功则处理成绩数据
  4. 使用fs.writeFile()方法将处理完成的数据写入新文件成绩-ok.txt

4.2执行结果与代码

image.png

// 读取 成绩.txt文件
const fs = require("fs");

fs.readFile("./成绩.txt", "utf8", function (err, dataStr) {
  if (err) {
    console.log("成绩读取失败" + err.message);
  }
  console.log("成绩读取成功! " + dataStr);
  // 处理成绩数据
  const arrOld = dataStr.split(" ");
  //   console.log(arrOld)
  const arrNew = [];
  arrOld.forEach((item) => {
    arrNew.push(item.replace("=", ":"));
  });
  //   console.log(arrNew)
  const newStr = arrNew.join("\r\n");
  //   console.log(newStr);
  // 调用fs.writeFile()写入 成绩-ok.txt 文件
  fs.writeFile("./成绩-ok.txt", newStr, function (err) {
    if (err) {
      console.log("成绩-ok写入失败" + err.message);
    }
    console.log("成绩-ok写入成功!");
  });
});

5.fs模块-路径动态拼接的问题

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

5.1 原因: 是由于 代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完成路径

image.png 如上图所示:

  1. 当我们正常在nodejs目录下执行node命令读取文件时,文件能够成功被读取
  2. 当我们通过cd..向上层目录退一级时(此时处于02-learn目录下),操作node命令自动补全路径,但是文件读取失败,通过错误信息可以看到读取文件的目录直接在02-learn目录层级去查找被操作文件,由于该目录下没有\files\1.txt文件,因此产生错误

5.2 解决方案

  1. 在使用fs模块操作文件时,直接提供完整的路径,避免提供以./或者../开头的相对路径,从而避免出现路径动态拼接的问题
const fs = require("fs");
// 写出完整的文件路径
// 移植性非常差,不利于维护(一旦某层的目录修改,就需要重新写)
//  注意代码中\斜线有转义的意思,所以应补充斜线为\\
fs.readFile("E:\\02-learn\\nodejs\\files\\1.txt", "utf8", function (err, dataStr) {
    if(err) {
        return console.log('文件读取失败'+ err.message)
    }
    console.log('文件读取成功, ' + dataStr)
});

image.png 2. 使用__dirname,__dirname表示当前文件所处的目录

const fs = require("fs");
// 使用__dirname
fs.readFile(__dirname +'/files/1.txt', "utf8", function (err, dataStr) {
    if(err) {
        return console.log('文件读取失败'+ err.message)
    }
    console.log('文件读取成功, ' + dataStr)
    console.log('__dirname:',__dirname)
});

如下图,我们可以打印__dirname,可以看到它的值就是当前文件所处目录 image.png