说明
本文为node.js学习的第一部分,主要面向的是之前没有了解过node的小白,希望大家能通过本文学习到以下知识点:
- 掌握基础的文件读写
- 解决路径问题
文件读写模块fs-readFile
我们只需要通过require引入fs模块,调用fs.readFile就可以使用它的功能。
例如我们想要读取同目录下hello.txt的内容时,就可以编写如下代码
const fs = require('fs')
fs.readFile('./hello.txt', (err, data) => {
if (err) {
// err表示文件读取失败的错误信息,如果文件读取成功值为null
console.log(`出错了!${err}`)
} else {
/* 这里的data为一个Buffer(存放二进制数据的缓存区,这里为显示方便展示为十六进制),
显示时通过toString方法显示原始数据 */
console.log(`error的值- ${err}`)
console.log(`data的类型是否为Buffer- ${data instanceof Buffer}`)
console.log(`data的值-`,data)
console.log(`data调用toString的值- ${data.toString()}`)
}
})
hello.txt内容
运行结果
注意!如果同目录下不存在hello.txt时,回调函数的err值就不再为null,这时候打印err会显示错误信息。
文件读写模块fs-writeFile
通过调用fs.writeFile我们就能够进行文件的写入。
相对于读取文件,写入文件更加简单一点,不管路径下存不存在目标文件它都可以进行写入。
目标文件不存在的情况
如果目标文件不存在,fs在写入文件时会自动创建。
例如我们想要在同级目录写入goodBye.txt时,就可以编写如下代码
const fs = require('fs')
fs.writeFile('./goodBye.txt', 'goodBye-node', err => {
if (err) {
console.log(err)
} else {
// err为null时代表写入成功
console.log('写入成功!')
}
})
运行结果
文件夹新增了goodBye.txt
goodBye.txt的内容
目标文件存在的情况
如果同目录下有同名文件,则会覆盖旧文件的内容。
我们修改一下之前代码写入的内容
const fs = require('fs')
fs.writeFile('./goodBye.txt', 'goodBye-node new!', err => {
if (err) {
console.log(err)
} else {
console.log('第二次写入成功!')
}
})
运行结果
覆盖后goodBye.txt的内容
读写文件存在的路径问题
./代表的是当前路径,当执行node命令的根路径发生变化时./代表的路径也会发生变化。
例如我们在执行第一个读文件的js时不在E:\node_project\node文件操作这个路径下执行node命令,我们返回到上一级使用E:\node_project> node .\node文件操作\read.js执行时,读取文件就会出错。
运行结果
可以看出红色方框圈出的路径和我们所认为的hello.txt的路径是不同的,这就是因为./做为相对路径指的是当前执行node命令的路径,也就是E:\node_project。
解决方案1 不使用相对路径,使用绝对路径
既然问题出在./上,我们自然而然可以想到不使用它,转而使用绝对路径解决问题。
下面我们把代码复制到引入path解决路径问题下并将代码改写如下
const fs = require('fs')
// 注意\是转义字符,想要表示单斜杠需要使用\\
const filePath = 'E:\\node_project\\引入path解决路径问题' + '\\hello.txt'
fs.readFile(filePath, (err, data) => {
if (err) {
console.log(`出错了!${err}`)
} else {
console.log(data.toString())
}
})
运行结果
可以看出虽然是在上一级执行了node命令,但仍然成功读取了hello.txt的内容,但是使用绝对路径不够灵活,程序泛用性不高,因此不推荐使用。
解决方案2 使用__dirname拼接路径
__dirname指的是当前js文件所处的路径,我们可以通过console.log()打印一下看看。
可以看出不管node命令执行时的路径是哪里,__dirname始终打印出E:\node_project\引入path解决路径问题。
因此我们可以将之前绝对路径的例子改写如下
const fs = require('fs')
const filePath = __dirname + '\\hello.txt'
fs.readFile(filePath, (err, data) => {
if (err) {
console.log(`出错了!${err}`)
} else {
console.log(data.toString())
}
})
运行结果
可以看出执行时不论node执行命令所处位置为哪,打印结果始终如一,不会报错且当read.js路径发生变化时,__dirname也会变化,不会因为改动文件位置导致功能受影响。
方案2的改进
我们还可以通过引入内置的path模块拼接路径,这样就不用考虑字符串反斜杠的转义问题了。
代码可以改写如下
const fs = require('fs')
const path = require('path')
const filePath = path.join(__dirname, './hello.txt')
fs.readFile(filePath, (err, data) => {
if (err) {
console.log(`出错了!${err}`)
} else {
console.log(data.toString())
}
})
运行结果
可以看出运行结果仍然正确。