Node中的fs文件系统模块和path路径模块

685 阅读5分钟

什么是fs文件系统模块

fs.readFile()方法,用来读取指定文件中的内容 fs.writeFile()方法 ,用来向指定的文件中写入内容 image.png fs模块用require('fs')

fs模块是从何来的?

当我们下载安装了node运行环境,node会将模块存放到我们的计算机中。

读取指定文件内容

fs.readFile()

  • 参数1:文件路劲
  • 参数2:输入编码例如:utf-8
  • 参数3:回调函数,拿到读取失败和成功的结果,err dataStr

image.png

//第一步:导入fs模块 我们利用require('fs')导入模块
const fs = require('fs')
//第二步:利用fs模块中的readFile()方法来读取文件
/*
参数1:文件路劲
参数2:输入编码例如:utf-8
参数3:回调函数,拿到读取失败和成功的结果,err dataStr
  */
fs.readFile('./读取文件/1.txt', 'utf8', function (err, dataStr) {
    //如果读取成功err就打印null,dataStr的值为文件内容
    //如果读取失败err就打印错误对象,dataStr的值为undefined
    console.log(err)
    console.log('------------')
    console.log(dataStr)
})

读取成功 image.png

读取失败

image.png

  1. 如果读取成功err就打印null,dataStr的值为文件内容
  2. 如果读取失败err就打印错误对象,dataStr的值为undefined

判断文件是否读取成功

fs.readFile('./读取文件/1.txt', 'utf-8', function (err, dataStr) {
    //当文件读取失败时err返回的是错误对象 if判断为true
    //当文件读取成功时err返回的是null if判断为false
    if (err) {
        return console.log('文件读取成功' + err.message);
    } else {
        console.log('文件读取成功' + dataStr)
    }
})

image.png

写入文件内容

image.png

  • 参数1:写入文件的路径
  • 参数2:写入文件的内容
  • 参数3:编码格式,默认utf-8(可省略)
  • 参数4:回调函数 拿取写入失败的结果err
const fs = require('fs')
/*
参数1:写入文件的路径
参数2:写入文件的内容
参数3:回调函数 拿取写入失败的结果err 
*/
fs.writeFile('./写入文件/1.txt', '我很爱你!', function (err) {
    //如果文件写入成功err打印出来的结果是null
    //如果文件写入失败err打印出来的是一个错误对象
    console.log(err)

})

image.png

  1. 如果文件写入成功err打印出来的结果是null
  2. 如果文件写入失败err打印出来的是一个错误对象

判断文件是否写入成功

const fs = require('fs')
/*
参数1:写入文件的路径
参数2:写入文件的内容
参数3:回调函数 拿取写入失败的结果err 
*/
fs.writeFile('./写入文件/1.txt', '我很爱你!', function (err) {
    //如果文件写入成功err打印出来的结果是null if判断的值为false
    //如果文件写入失败err打印出来的是一个错误对象 if判断的值为true

    if (err) {
        console.log('文件写入失败:' + err.message);
    } else {
        console.log('文件写入成功!')

    }

})

fs模块小案例

小知识点:/n 表示换行 /r 表示回车 replace()替换字符串

image.png image.png

image.png

//导入fs模块
const fs = require('fs')
//读取文件信息
fs.readFile('./成绩.txt', 'utf-8', function (err, dataStr) {
    //判断是否读取成功
    if (err) {
        console.log('文件读取失败:' + err.message)
    } else {
        //将读取的值存入str变量
        let str = dataStr
        let arr = str.split(' ')
        // 处理内容
        arr = arr.map(v => {
            return v.replace('=', ':')
        })
        console.log(arr)
        str = arr.join('\n')
        //写入文件
        fs.writeFile('./成绩-ok.txt', str, function (err) {
            //判断写入文件是否成功
            if (err) {
                console.log('文件写入失败:' + err.message)
            } else {
                console.log('文件写入成功!')
            }
        })
    }
})

路径动态拼接错误问题

使用fs模块操作文件时,如果提供的操作是以./或../开头的相对路径时,很容易出现路径动态拼接错误的问题。

原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径

解决方法:在代码中使用完整的文件存放路径或__dirname

image.png

image.png

image.png

原因是:我们用相对路径node会在当前路径与你代码的路径进行拼接

image.png

使用完整路径解决路径动态拼接问题

缺点:移植性非常差、不利于维护

image.png

const fs = require('fs')
//在js中一个\代表转义,我们要用两个\\代表路径
fs.readFile('C:\\Users\\86178\\Desktop\\编程学习\\node编程\\day01了解node的作用\\读取文件\\1.txt', 'utf-8', function (err, dataStr) {
    if (err) {
        console.log('文件读取失败' + err.message);
    } else {
        console.log('文件读取成功:' + dataStr);
    }
})

注意:要将\换成双\

__dirname解决路径动态拼接问题

__dirname 表示当前文件所处的目录

const fs = require('fs')
//__dirname 表示当前文件所处的目录
console.log(__dirname)
fs.readFile(__dirname + '/读取文件/1.txt', 'utf-8', function (err, dataStr) {
    if (err) {
        console.log('文件读取失败:' + err.message)
    } else {
        console.log("文件读取成功:" + dataStr)
    }
})

image.png

什么是path路径模块

path模块是Node.js官方提供的\用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

  • path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串
  • path.basename()方法,用来从字符串中,将文件名解析出来

导入path模块require('path')

const fs = require('fs')
const path = require('path')
//注意: path.join()中 ../ 会抵消前面的路径
const pathStr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathStr) // \a\b\d\e
fs.readFile(path.join(__dirname, '/读取文件/1.txt'), 'utf-8', function (err, dataStr) {
    if (err) {
        console.log('文件读取失败:' + err.message)
    } else {
        console.log("文件读取成功:" + dataStr)
    }
})

image.png 注意:今后凡是涉及到路径拼接的操作,都要使用path.join()方法进行处理。不要直接使用+进行字符串的拼接。

获取路径中的文件名

path.basename()

  • 参数1:路径字符串
  • 参数2:文件扩展名
  • 返回:表示路径中的最后一部分 image.png
const path = require('path')
//模拟路径
const pathStr = '/a/v/b/d/index.html'
const fullName = path.basename(pathStr)
console.log(fullName);

image.png

获取路径的扩展名

path.extname()

  • 参数1:表示路径的字符串
  • 返回:得到的扩展名字符串

image.png

const path = require('path')
const fpath = '/a/v/d/s/index.html'//路径字符串
const fext = path.extname(fpath)
console.log(fext);

image.png

时钟案例

const fs = require('fs')
const path = require('path')
// 定义正则表达式,分别匹配<style></style> 和 <script></script> 标签
const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/
const regHtml = /<html>[\s\S]*<\/html>/
//调用fs模块读取文件
fs.readFile(path.join(__dirname, '../index.html'), 'utf-8', (err, dataStr) => {
    if (err) {
        return console.log('文件读取失败:' + err.message)
    } else {
        //封装写入样式
        function resolveCSS(dataStr) {
            const r1 = regStyle.exec(dataStr)
            const newCSS = r1[0].replace('<style>', '').replace('</style>', '')
            fs.writeFile(path.join(__dirname, '../css/index.css'), newCSS, (err) => {
                if (err) {
                    console.log('写入失败!' + err.message)
                } else {
                    console.log('样式写入成功!');
                }
            })

        }
        //封装写入js
        function resolveJs(dataStr) {
            const r2 = regScript.exec(dataStr)
            const newJs = r2[0].replace('<script>', '').replace('</script>', '')
            fs.writeFile(path.join(__dirname, '../js/index.js'), newJs, (err) => {
                if (err) {
                    return console.log('写入js文件失败!' + err.message)
                } else {
                    console.log('写入js文件成功')
                }
            })
        }
        //封装写入html文件
        function resolveHtml(dataStr) {

            const newHtml = dataStr.replace(regStyle.exec(dataStr)[0], `<link rel="stylesheet" href="./css/index.css">`).replace(regScript.exec(dataStr)[0], `<script src="./index.js"></script>`)
            fs.writeFile(path.join(__dirname, '../newIndex.html'), newHtml, (err) => {
                if (err) {
                    return console.log('写入html文件失败' + err.message)
                } else {
                    console.log('写入html文件成功!')
                }
            })
        }
        resolveCSS(dataStr)
        resolveJs(dataStr)
        resolveHtml(dataStr)
    }
})