fs 文件系统模块
fs 模块是 Node.js 官方提供的,用来操作文件的模块。提供了一系列的方法和属性,用来满足用户对文件的操作需求;
例如:
fs.readFile() 方法,用来读取指定文件中的内容;
fs.writeFile() 方法,用来向指定的文件写入内容;
要在JS代码中,使用 fs 模块操作文件,需要先引入这个模块;
引入模块基本语法:
const fs = require('fs')
fs 模块从哪儿来的?安装了 Node.js 后就自带了,用时直接引入就行。
读取指定文件内容
fs.readFile() 的语法格式
fs.readFile(path[,options],callback)
-- path: 必选参数,字符串,表示文件路径
-- options: 可选参数,表示以什么编码格式来读取文件
-- callback: 必选参数,文件读取完成后,通过回调函数拿到读取结果
示例:
写一个 fs.js 文件,读取 files/hello.md 文件;
const fs = require('fs')
fs.readFile('./files/hello.md','utf8',(err,data)=>{
console.log(err);
console.log('------');
console.log(data);
})
提示1:输出回调的两个参数数据,用"-"分隔;
提示2:编码格式一般指定 utf8 ,不指定会输出 buffer 二进制数据;
提示3:回调函数有两个参数,err 是失败的结果,data 是成功的结果;
看下结果:
成功读取了文件的内容,err 为 null,data为文件内容;
改成错误的路径,看下结果:
读取失败了,err 输出为错误对象,data 输出为 undefined。
判断文件读取是否成功
加个判断,让代码看起来更安全;
const fs = require('fs')
fs.readFile('./files/hello.md', 'utf8', (err, data) => {
if (err) {
return console.log('读取失败:' + err.message);
}
console.log('读取成功,内容是:' + data);
})
提示:为什么要用 return 呢?如果失败直接 return 结束,后面不执行了。
看下读取成功的结果:
改成错误的路径:hello.mdd 不存在的文件
fs.readFile('./files/hello.mdd', 'utf8', (err, data) => {
//...
})
输出错误消息;
向指定文件写入内容
fs.writeFile() 的语法格式
fs.writeFile(file,data[,options],callback)
-- file: 必选参数,需要指定文件存放的路径字符串
-- data:必选参数,要写入的内容
-- options: 可选参数,表示以什么编码格式来写入文件,默认utf8
-- callback: 必选参数,文件写入完成后的回调
示例:
写一个 fs_write.js 文件,写入一首诗到 files/poem.md 文件;
const fs= require('fs')
let data = '我打碎了夕阳,想起你明媚的模样,与你牵手的过往,成为我余生的光。'
fs.writeFile('./files/poem.md',data,(err)=>{
console.log(err);
})
提示1:一首小诗有点长,单独存放变量data中;
提示2:第三个参数 options 省略了,默认 utf8 编码格式;
揭示3:回调中只有一个参数 err,即写入失败后的错误对象;
看下结果:
输出结果为 null ,代表成功写入文件;
改成不存在的路径,让程序报错:
fs.writeFile('f:./files/poem.md',data,(err)=>{
//...
})
提示:不存在这个路径,看错误结果;
判断文件是否写入成功
加个判断语法,让代码更友好、更安全;
const fs= require('fs')
let data = '我打碎了夕阳,想起你明媚的模样,与你牵手的过往,成为我余生的光。'
fs.writeFile('./files/poem.md',data,'utf8',(err)=>{
if(err){
return console.log('出错了:'+err.message);
}
console.log("成功写入一首诗");
})
提示:诗还是那首诗,err 对象不为 null 代码出错了;否则即成功写入;
成功写入的结果:
写入失败的结果:改个错误的路径测试;
文件读写练习
需求:使用 fs 模块,把 score.txt 文件中的考试数据,整理到 scroe_ok.txt 文件中;
整理前:score.txt
小明=99 小红=100 小王=89 小黑=68 小欠=90
整理后:score_ok.txt
小明:99
小红:100
小王:89
小黑:68
小欠:90
需求分析:
1)导入fs模块;
2)使用fs.readFile() 方法,读取 score.txt
3)判断文件是否读取失败
4)文件读取成功后,处理成绩数据
5)调用fs.writeFile() 方法,写入新文件 score_ok.txt
代码实现:
const fs = require('fs')
fs.readFile('./files/score.txt', 'utf-8', (err, data) => {
if (err) {
return console.log('出错了:' + err.message)
}
// 按空格分隔符取数据,变为数组
let arrOld = data.split(' ')
let arrNew = []
arrOld.forEach(item=>{
// 遍历旧数组,生成新数组格式
arrNew.push(item.replace('=',':'))
})
// 拼接数组成字符串赋值给 arrStr
let arrStr = arrNew.join('\r\n')
fs.writeFile('./files/score_ok.txt',arrStr,(err)=>{
if(err){
return console.log('出错了:'+err.message)
}
console.log('成功写入score_ok.txt');
})
})
提示:对数组的几种操作方法,split()、forEach()、replace()、join()
看下结果:
看下生成的文件 score_ok.txt
路径动态拼接的问题
在使用 fs 模块操作文件时,使用 "./" 或 "../" 相对路径,容易拼接错误;
const fs = require('fs')
fs.readFile('./files/hello.md','utf8',(err,data)=>{
if(err){
return console.log('读取失败:'+err.message)
}
console.log('读取成功:'+data);
})
同一个文件,在 fs.js 当前目录使用命令执行没有问题;
> node fs.js
一旦放到其他目录再执行,就会出问题了;
> node ./nodejs/fs.js
错误的原因:代码运行时,会执行 node 命令所在的目录,动态拼接出被操作的文件的完整路径。
正确的完整路径是:
D:\Pro_Temp\nodejs\files\hello.md
出错后的完整路径是:
D:\Pro_Temp\files\hello.md
注意:Pro_Temp 目录下没有 files 目录,所以报错了;
引入 __dirname 路径属性
__dirname 就表示当前文件所在的目录,是个绝对路径,这样就不存在执行 node 命令的目录导致的路径拼接错误了;
改下代码:使用 __dirname
重新拼接绝对路径;
const fs = require('fs')
fs.readFile(__dirname + '/files/hello.md','utf8',(err,data)=>{
if(err){
return console.log('读取失败:'+err.message)
}
console.log('读取成功:'+data);
})
提示:即使不在 fs.js 所在目录,也能正确执行读取文件了;