node.js简单学习(一)fs模块

162 阅读3分钟

说明

本文为node.js学习的第一部分,主要面向的是之前没有了解过node的小白,希望大家能通过本文学习到以下知识点:

  1. 掌握基础的文件读写
  2. 解决路径问题

文件读写模块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()}`)
    }
})

image.png

hello.txt内容

image.png

运行结果

image.png

注意!如果同目录下不存在hello.txt时,回调函数的err值就不再为null,这时候打印err会显示错误信息。

image.png

文件读写模块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('写入成功!')
    }
})

image.png

运行结果

image.png

文件夹新增了goodBye.txt

image.png

goodBye.txt的内容

image.png

目标文件存在的情况

如果同目录下有同名文件,则会覆盖旧文件的内容。

我们修改一下之前代码写入的内容

const fs = require('fs')
fs.writeFile('./goodBye.txt', 'goodBye-node new!', err => {
    if (err) {
        console.log(err)
    } else {
        console.log('第二次写入成功!')
    }
})

运行结果

image.png

覆盖后goodBye.txt的内容

image.png

读写文件存在的路径问题

./代表的是当前路径,当执行node命令的根路径发生变化时./代表的路径也会发生变化。

例如我们在执行第一个读文件的js时不在E:\node_project\node文件操作这个路径下执行node命令,我们返回到上一级使用E:\node_project> node .\node文件操作\read.js执行时,读取文件就会出错。

运行结果

image.png

可以看出红色方框圈出的路径和我们所认为的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())
    }
})

运行结果

image.png

可以看出虽然是在上一级执行了node命令,但仍然成功读取了hello.txt的内容,但是使用绝对路径不够灵活,程序泛用性不高,因此不推荐使用。

解决方案2 使用__dirname拼接路径

__dirname指的是当前js文件所处的路径,我们可以通过console.log()打印一下看看。

image.png

可以看出不管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())
    }
})

运行结果

image.png

可以看出执行时不论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())
    }
})

运行结果

image.png

可以看出运行结果仍然正确。