一. fs文件系统模块
1.1 什么是fs文件系统模块
-
fs文件系统方法
- fs.readFile()
- 用来读取指定文件的内容。
- fs.writeFile()
- 用来向指定文件写入内容。
- fs.readFile()
-
若在js代码中使用fs模块,则先需导入它。
const fs = require('fs');
1.2 读取指定文件的内容
-
语法格式如下:
-
fs.readFile(path[, options], callback)
-
参数解读
- path:必选参数,字符串,表示文件的路径。
- options:可选参数,表示以什么编码格式读取文件。
- callback:必选参数,文件读取完后,通过回调函数拿到读取的结果。
-
-
实战代码
// 导入fs模块 const { kMaxLength } = require('buffer'); const fs = require('fs'); // 使用readfile方法 fs.readFile('../笔记/css.md', 'utf-8', function (err, datastr) { console.log(err); console.log('-------------'); console.log(datastr); })
-
结果演示
-
成功读取,则err为null
-
失败读取,则err为错误对象
-
-
-
如何利用err,来判断是否读取成功?
-
代码
// 导入fs模块 const { kMaxLength } = require('buffer'); const fs = require('fs'); // 使用readfile方法 fs.readFile('../笔记/css1.md', 'utf-8', function (err, datastr) { if (err) { return console.log(`读取失败,${err.message}`); } console.log(`读取成功 + ${datastr}`); })
-
分析
- 通过判断err是否为null来判断。
-
1.3 向指定的文件写入内容
-
语法格式如下
-
fs.writeFile(file, data, [, options], callback);
-
参数解读
- file:必选参数,指定一个文件路径的字符串,表示文件的存放路径。
- data:必选参数,表示要写入的值。
- [, options]:可选参数,指定编码。
- callback:必选参数,文件写入完毕后,通过回调函数拿到结果。
-
-
实战代码
// 导入模块 const fs = require('fs'); // 调用writefile fs.writeFile('../笔记/111.txt', '132', function (err) { if (err) { return console.log(err.message); } })
- 结果演示
- 写入成功
- 控制台无反应,查看文件后发现内容存在。
- 写入失败
- 比如datastr不为字符串类型。
- 写入成功
- 结果演示
1.4 练习 - 考试成绩整理
使用fs文件系统模块,将成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中。
整理前,成绩.txt文件数据如下:
整理后,成绩-ok.txt文件数据如下:
解答:
- 代码
// 导入fs模块 const fs = require('fs'); // 读取成绩文件 fs.readFile('../笔记/成绩.txt', 'utf-8', function (err, datastr) { if (err) { return console.log(`读取失败 + ${err.message}`); } console.log(datastr); // 空格分隔,之后装入数组中 const oldArr = datastr.split(' '); console.log('oldArr: ' + oldArr); // 遍历旧数组,将=替换为:, 装入新数组中 const newArr = []; oldArr.forEach(item => { newArr.push(item.replace('=', ':')); }) console.log('newArr: ' + newArr); // 将新数组每一个item加上换行后,装入字符串中 const newStr = newArr.join('\r\n'); console.log('newStr: ' + newStr); // 写入成绩-ok文件 fs.writeFile('../笔记/成绩-ok.txt', newStr, function (err) { if (err) return console.log(err.message); }) console.log('写入成功'); })
- 结果
1.5 路径动态拼接问题
-
在使用fs模块操作文件时,如果提供的操作路径是以./或…/开头的相对路径,很容易出现动态拼接错误的问题。
-
例如,【03. 练习-考试成绩整理.js】文件在Node.js文件夹下。
如果cd…一下,则会出现如下结果:
- 那么原因何在?
- 因为,代码运行时,会以执行node命令时所在的目录为根目录,动态拼接被操作文件的完整路径。
- 上图中并不是以LearnQianDuan为根,是因为我在相对路径中使用了…/,导致它返回到了上一级VSCodeProject目录。
- 那么,由此可知,上述操作失败的原因在于路径拼接错误了。
- 因为,代码运行时,会以执行node命令时所在的目录为根目录,动态拼接被操作文件的完整路径。
- 如何解决呢?
- 只需将以./或…/开头的相对路径改为绝对路径即可。
-
局限性:移植性差,不利维护。
-
代码
const fs = require('fs'); fs.readFile('D:\\develop\\VSCodeProject\\LearnQianDuan\\Node..js\\03. 练习-考试成绩整理.js', 'utf-8', function (err, datastr) { if (err) { return console.log(err.message); } })
-
- 利用__dirname拼接相对路径
-
代码
const fs = require('fs); // 当前js文件所在路径:D:\develop\VSCodeProject\LearnQianDuan\Node.js\04. fs路径动态拼接.js const path = __dirname + '/../笔记/1111.txt' fs.readFile(path, 'utf-8', function (err, datastr) { // 拼接后的路径 console.log(path); // 文件内容 console.log(datastr); if (err) { return console.log(err.message); } })
-
结果
-
分析
-
__dirname(这里是两个下划线):表示当前文件所在目录。
-
注意路径拼接时,路径字符串开头必须以 / 开头,否则路径就会拼错,例如
-
-
- 只需将以./或…/开头的相对路径改为绝对路径即可。
- 那么原因何在?