一、fs 定义
fs 模块为 nodejs 的核心模块之一,主要处理文件的读写、复制、s删除、重命名等操作。当需要使用该模块时,需要先导入该文件。 主要记录读、写文件内容。
var fs = require('fs');
当前示例的文件路径如下截图:
二、fs.readFile() 读取指定文件内容
fs.readFile(path[,options],callback)表示用来读取指定文件中的内容,传 3 个参数
- path: 必填项,'传字符串', 填写我们要读取的文件路径
- options: 可选项,表示以什么样的编码格式来读取文本,不传默认使用
utf8来编译。- 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() 注意项
-
fs.write()方法只能用来创建文件,不能用来创建目录。所以我们在用它创建文件的时候,要提前把它所要旋转的目录创建好。 -
重新调用
fs.write()写入同一个文件,新写入的内容会覆蓋之前的旧内容。
三、读写文件内容应用
使用 fs 文件系统模块,将【素材】目录下的 【成绩.txt】文件中的考试数据,整理到 file 目录下的 【成绩-ok.txt】文件中。
目录如下截图:
【素材】目录下的 【成绩.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 命令:
现在我们在 在一层 进行执行
const fs = require('fs')
fs.readFile('./file/2.txt', (err, data) => {
err ? console.log(err.message, '读取失败') : console.log('读取成功')
})
执行命令后发现,返回错误,因为代码在运行的时候,会以执行 node 命令时所处的目录,而当前 node 命令所处的目录下没有 对应的要执行 index.js 文件。
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('读取成功')
})