0
点赞
收藏
分享

微信扫一扫

Node.js(笔记02) - fs文件系统模块

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 是成功的结果;

看下结果:

Node.js(笔记02) - fs文件系统模块_Node.js

成功读取了文件的内容,err 为 null,data为文件内容;

改成错误的路径,看下结果:

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_02

读取失败了,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 结束,后面不执行了。

看下读取成功的结果:

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_03

改成错误的路径:hello.mdd 不存在的文件

fs.readFile('./files/hello.mdd', 'utf8', (err, data) => {
//...
})

Node.js(笔记02) - fs文件系统模块_Node.js_04

输出错误消息;


向指定文件写入内容

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,即写入失败后的错误对象;

看下结果:

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_05

输出结果为 null ,代表成功写入文件;

Node.js(笔记02) - fs文件系统模块_Node.js_06

改成不存在的路径,让程序报错:

fs.writeFile('f:./files/poem.md',data,(err)=>{
//...
})

提示:不存在这个路径,看错误结果;

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_07

判断文件是否写入成功

加个判断语法,让代码更友好、更安全;

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 代码出错了;否则即成功写入;

成功写入的结果:

Node.js(笔记02) - fs文件系统模块_Node.js_08

写入失败的结果:改个错误的路径测试;

Node.js(笔记02) - fs文件系统模块_Node.js_09


文件读写练习

需求:使用 fs 模块,把 score.txt 文件中的考试数据,整理到 scroe_ok.txt 文件中;

整理前:score.txt 

小明=99 小红=100 小王=89 小黑=68 小欠=90

Node.js(笔记02) - fs文件系统模块_Node.js_10

整理后: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()

看下结果:

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_11

看下生成的文件 score_ok.txt

Node.js(笔记02) - fs文件系统模块_fs 文件系统模块_12


路径动态拼接的问题

在使用 fs 模块操作文件时,使用 "./" 或 "../" 相对路径,容易拼接错误;

const fs  = require('fs')
fs.readFile('./files/hello.md','utf8',(err,data)=>{
if(err){
return console.log('读取失败:'+err.message)
}
console.log('读取成功:'+data);
})

Node.js(笔记02) - fs文件系统模块_Node.js_13

同一个文件,在 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);
})

Node.js(笔记02) - fs文件系统模块_Node.js_14

提示:即使不在 fs.js 所在目录,也能正确执行读取文件了;


举报

相关推荐

0 条评论