Node-fs文件系统模块

1.1 什么是fs文件系统模块

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

例如:

fs.readFile()方法, 用来读取制定个文件中的内容

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

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

const fs = require('fs');

1.2 读取指定文件中的内容

1.2.1 fs.readFile()语法格式

用来读取制定个文件中的内容

fs.readFile(path[,options],callback);

参数1: path 必选参数,字符串,表示文件的

参数2:可选参数,表示以什么编码格式来读取文件

参数3: 必选参数,文件读取完成后,通过回调函数拿到读取的结果

1.2.2 fs.readFile()示例代码

以utf-8的编码格式,读取指定文件的内容

const fs = require('fs');
fs.readFile('./good.txt','utf-8',function(err,dataStr){
    //如果读取成功,err的值为null,dataStr存储着文件里面的值
    // 如果读取失败,err的值为错误对象,dataStr为undefined
    console.log(err); //打印失败的结果
    console.log("-----");
    console.log(dataStr); // 打印成功的结果
})

1.2.3 判断文件是否读取成功

可以判断err对象是否为Null,以此来判断文件是否读取成功

const fs = require('fs');
fs.readFile('./good33.txt','utf-8',function(err,dataStr){
    //如果读取成功,err的值为null,dataStr存储着文件里面的值
    // 如果读取失败,err的值为错误对象,dataStr为undefined
    if (err) {
        console.log("读取失败");
    }
    console.log("-----");
    console.log(dataStr); // 打印成功的结果
})

1.3 向指定的文件中写入内容

1.3.1 fs.writeFile()的语法格式

使用 fs.writeFile()方法,可以向指定的文件中写入内容

fs.writeFile(path,data[,options],callback);

参数1:必选参数,需要指定一个文件路径的字符串,表示文件的路径

参数2: 必选参数,表示要写入的内容

参数3: 可选参数,表示以什么格式写入文件内容,默认为utf-8

参数4,: 必选参数,文件写入完成后的回调函数

1.3.2 fs.writeFile()案例

const fs = require('fs');
let data = "Hello World22";
let path = './good.txt';
fs.writeFile(path, data, 'utf-8', function (err) {
    if (err) {
        console.log("文件写入错误:" + err);
    }
    //文件写入成功,err为null
    //写入失败,err的值为一个错误对象
})

1.3.3 判断文件是否写入成功

const fs = require('fs');
let dataStr = "Hello World22";
let path = './good.txt';
fs.writeFile(path, dataStr, 'utf-8', function (err) {
    if (err) {
        console.log("文件写入错误:" + err);
    }
})

1.4 练习-考试成绩整理

利用fs文件系统模块,把素材目录成绩.txt文件中的考试数据,整理到成绩-ok.txt

整理前:

李明=100 小红=100 李刚=150 小刚=124

希望整理后的样子

小明: 100
小红: 100
李刚: 150
小刚: 124

实现步骤:

  • 导入需要的fs文件模块
  • 使用fs.readFile()方法, 读取素材目录下成绩.txt文件内容
  • 判断文件是否读取成功
  • 文件读取成功后,处理成绩数据
  • 将处理完成的成绩数据,调用fs.writeFile()方法,写入到新文件 成绩-ok.txt中
// 1.导入fs模块
const fs = require('fs');

// 2.调用fs.readFile()读取文件内容
const path = "./成绩.txt";
fs.readFile(path, 'utf-8', function (err, dataStr) {
    // 3.判断是否读取成功
    if (err) {
        console.log('读取失败' + err.message);
    }
    // 如果读取成功,打印读取结果
    console.log('读取结果为:' + dataStr + '\n');
    // 4.先把成绩的数据,按照空格进行分割
    // 然后循环分割后逇数组,对每一项数据,进行字符串的替换操作
    // 把新数组中的每一项进行合并。得到一个新的字符串
    const data_new = dataStr.split(' '); //split方法,拿空格作为分隔符,把字符串分割开来,得到一个数组
    const data_replace = []; //创建空数组
    data_new.forEach(function (item) {
        data_replace.push(item.replace('=', ':'));
    }); //把数组里的每个值中的=号替换为:,压入到data_new空数组中
    write_data = data_new.join('\r\n'); //join() 方法将数组作为字符串返回。 定义write_data,准备写入到成绩-ok.txt文件中
    /* 在Windows中:
    '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
    '\n' 换行,换到当前位置的下一行,而不会回到行首;
    */
    // 写入文件
    const path_write = "./成绩-ok.txt"; //定义写入目录
    fs.writeFile(path_write, write_data, function (err) {
        if (err) {
            return console.log('写入错误');
        }
        console.log('成绩写入成功');
    })
})


1.5 模块-路径动态拼接问题

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

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

1.5.1 演示错误

const fs = require('fs');
fs.readFile('./file/test.txt','utf-8',function(err,dataStr){
     if(err) {
        return console.log('读取文件失败' + err.message);
     }
     console.log('读取文件成功' + dataStr);
})

image-20220909174816515

1.5.2 解决问题

如果要解决这个问题,可以提供一个完整的文件存放路径