• Node.js开发-fs模块


    fs模块

    fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取,以及文件夹的相关操作

    1) 文件写入

    文件写入就是将 数据 保存到 文件 中,可以使用如下几个方法来实现该效果

    方法说明
    writeFile异步写入
    writeFileSync同步写入
    appendFile / appendFileSync追加写入
    createWriteStream流式写入

    writeFile 异步写入

    语法 fs.writeFile(file, data[, options], callback)

    参数说明:

    • file 文件名
    • data 待写入的数据
    • options 选项设置 (可选)
    • callback 写入回调

    返回值: undefined

    /**
     * 需要:
     * 新建一个文件:座右铭.txt
     * 写入内容:三人行,则必有我师焉
     */
    // 1.导入fs模块
    const fs = require('fs')
    
    // 2.写入文件
    fs.writeFile('./座右铭.txt', "三人行,则必有我师焉", err => {
        // err 写入失败:错误对象, 写入成功:null
        if (err) {
            console.log("写入失败");
            return;
        } else {
            console.log("写入成功");
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    writeFileSync 同步写入

    语法: fs.writeFileSync(file, data[, options])

    参数与 fs.writeFile 大体一致,只是没有 callback 参数

    返回值: undefined

    try{
    	fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
    }catch(e){
    	console.log(e);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    appendFile / appendFileSync 追加写入

    appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同

    语法:

    • fs.appendFile(file, data[, options], callback)
    • fs.appendFileSync(file, data[, options])

    返回值: 二者都为 undefined

    // 2.调用appendFile
    fs.appendFile("./座右铭.txt", "\r\n择其善者而从之,。。。。", err=>{
        if (err) {
            console.log("写入失败");
            return;
        } else {
            console.log("写入成功");
        }
    });
    
    // 2.调用appendFileSync
    fs.appendFileSync("./座右铭.txt", "\r\n温故而知新。。。")
    
    // 2.调用writeFile(追加或覆盖)
    fs.writeFile("./座右铭.txt", "love love",{flag:'a'} ,err=>{
        if (err) {
            console.log("写入失败");
            return;
        } else {
            console.log("写入成功");
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    createWriteStream 流式写入

    语法: fs.createWriteStream(path[, options])

    参数说明:

    • path 文件路径
    • options 选项配置( 可选 )

    返回值: Object

    /**
     * 观书有感.txt
     */
    
    // 1.导入fs模块
    const fs = require("fs");
    
    // 2.创建写入流对象
    const ws = fs.createWriteStream("./观书有感.txt");
    
    // 3.write
    ws.write("半亩方塘一鉴开\r\n");
    ws.write("天光运功徘徊\r\n");
    
    // 4.关闭通道
    ws.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。

    流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景

    写入文件的场景

    文件写入 在计算机中是一个非常常见的操作,下面的场景都用到了文件写入

    • 下载文件
    • 安装软件
    • 保存程序日志,如 Git
    • 编辑器保存文件
    • 视频录制

    需要持久化保存数据 的时候,应该想到 文件写入

    2) 文件写入

    文件读取顾名思义,就是通过程序从文件中取出其中的数据,可以使用如下几种方式:

    方法说明
    readFile异步读取
    readFileSync同步读取
    createReadStream流式读取

    readFile 异步读取

    语法: fs.readFile(path[, options], callback)

    参数说明:

    • path 文件路径
    • options 选项配置
    • callback 回调函数

    返回值: undefined

    // 1.引入fs模块
    const fs = require("fs")
    
    // 2.异步读取
    fs.readFile("./观书有感.txt", (err, data) => {
        if (err) {
            console.log("读取失败");
            return;
        }
        console.log(data.toString());
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    readFileSync 同步读取

    语法: fs.readFileSync(path[, options])

    参数说明:

    • path 文件路径
    • options 选项配置

    返回值: string | Buffer

    // 1.引入fs模块
    const fs = require("fs")
    
    // 2.同步读取
    let data = fs.readFileSync("./观书有感.txt");
    console.log(data.toString());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    createReadStream 流式读取

    语法: fs.createReadStream(path[, options])

    参数说明:

    • path 文件路径

    返回值: Object

    // 1.引入fs模块
    const fs = require("fs");
    
    // 2.读取流对象
    const rs = fs.createReadStream("./观书有感.txt");
    
    // 3.绑定data事件
    rs.on("data", chunk => {
        console.log(chunk);
    });
    
    // 4.end
    rs.on("end", () => {
        console.log("读取完成");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    每次取出 64k 数据后执行一次 data 回调

    读取完毕后, 执行 end 回调

    读取文件应用场景

    • 电脑开机

    • 程序运行

    • 编辑器打开文件

    • 查看图片

    • 播放视频

    • 播放音乐

    • Git 查看日志

    • 上传文件

    • 查看聊天记录

    3) 文件移动与重命名

    在 Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹

    语法:

    fs.rename(oldPath, newPath, callback)

    fs.renameSync(oldPath, newPath)

    参数说明:

    • oldPath 文件当前的路径

    • newPath 文件新的路径

    • callback 操作后的回调

    // 1.导入fs模块
    const fs = require("fs")
    
    // 2.调用rename方法
    fs.rename("./座右铭.txt", "./我的新座右铭.txt", err => {
        if (err) {
            console.log("操作失败");
            return;
        }
        console.log("操作成功");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4) 文件删除

    在 Node.js 中,我们可以使用 unlinkunlinkSync 来删除文件

    语法:

    • fs.unlink(path, callback)

    • fs.unlinkSync(path)

    参数说明:

    • path 文件路径

    • callback 操作后的回调

    // 1.导入fs模块
    const fs = require("fs")
    
    // 2.调用 unlink 方法 unlinkSync
    fs.unlink("./观书有感.txt", err => {
        if (err) {
            console.log("删除失败");
            return;
        }
        console.log("删除成功");
    });
    
    // 2.调用 rm 方法 rmSync
    fs.rm("./data.txt", err => {
        if (err) {
            console.log("删除失败");
            return;
        }
        console.log("删除成功");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    5) 文件夹操作

    借助 Node.js 的能力,我们可以对文件夹进行 创建 、 读取 、 删除 等操作

    方法说明
    mkdir / mkdirSync创建文件夹
    readdir / readdirSync读取文件夹
    rmdir / rmdirSync删除文件夹

    mkdir 创建文件夹

    在 Node.js 中,我们可以使用 mkdir 或 mkdirSync 来创建文件夹

    语法:

    • fs.mkdir(path[, options], callback)

    • fs.mkdirSync(path[, options])

    参数说明:

    • path 文件夹路径

    • options 选项配置( 可选 )

    • callback 操作后的回调

    // 1.导入fs模块
    const fs = require("fs")
    
    // 2-1.创建文件夹
    fs.mkdir("./html", err => {
        if (err) {
            console.log("创建失败");
            return;
        }
        console.log("创建成功");
    });
    
    // 2-2.递归创建
    fs.mkdir("./a/b/c", {recursive: true}, err => {
        if (err) {
            console.log("创建失败");
            return;
        }
        console.log("创建成功");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    readdir 读取文件夹

    在 Node.js 中,我们可以使用 readdirreaddirSync 来读取文件夹

    语法:

    • fs.readdir(path[, options], callback)

    • fs.readdirSync(path[, options])

    参数说明:

    • path 文件夹路径

    • options 选项配置( 可选 )

    • callback 操作后的回调

    // 2-3 读取文件夹
    fs.readdir("./", (err, data) => {
        if (err) {
            console.log("读取失败");
            return;
        }
        console.log("读取成功"+data);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    rmdir 删除文件夹

    在 Node.js 中,我们可以使用 rmdirrmdirSync 来删除文件夹

    语法:

    • fs.rmdir(path[, options], callback)

    • fs.rmdirSync(path[, options])

    参数说明:

    • path 文件夹路径

    • options 选项配置( 可选 )

    • callback 操作后的回调

    // 2-4 删除文件夹
    fs.rmdir("./html", err => {
        if (err) {
            console.log("删除失败");
            return;
        }
        console.log("删除成功");
    });
    
    // 递归删除-不推荐使用
    fs.rmdir("./a", {recursive: true}, err => {
        if (err) {
            console.log("删除失败"+err);
            return;
        }
        console.log("删除成功");
    });
    
    // 递归删除-推荐使用
    fs.rm("./a", {recursive: true}, err => {
        if (err) {
            console.log("删除失败"+err);
            return;
        }
        console.log("删除成功");
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    6) 查看资源状态

    在 Node.js 中,我们可以使用 statstatSync 来查看资源的详细信息

    语法:

    • fs.stat(path[, options], callback)

    • fs.statSync(path[, options])

    参数说明:

    • path 文件夹路径

    • options 选项配置( 可选 )

    • callback 操作后的回调

    // 1.导入fs模块
    const fs = require("fs");
    
    // 2.调用 stat
    fs.stat("./1-文件写入.js", (err, data) => {
        if (err) {
            console.log("操作失败");
            return;
        }
        console.log(data);
        console.log(data.isFile());
        console.log(data.isDirectory());
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7) 相对路径问题

    fs 模块对资源进行操作时,路径的写法有两种:

    • 相对路径

      • ./座右铭.txt 当前目录下的座右铭.txt
      • 座右铭.txt 等效于上面的写法
      • ../座右铭.txt 当前目录的上一级目录中的座右铭.txt
    • 绝对路径

      • D:/Program Files windows 系统下的绝对路径
      • /usr/bin Linux 系统下的绝对路径

    相对路径中所谓的 当前目录 ,指的是 命令行的工作目录 ,而并非是文件的所在目录

    所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG

    8) __dirname

    __dirnamerequire 类似,都是 Node.js 环境中的’全局’变量

    __dirname 保存着 当前文件所在目录的绝对路径 ,可以使用 __dirname 与文件名拼接成绝对路径

    代码示例:

    let data = fs.readFileSync(__dirname + '/data.txt');
    console.log(data);
    
    • 1
    • 2

    使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的Bug

  • 相关阅读:
    Flutter案例日程安排首页效果 Lottie动画与Shimmer实现的微光效果
    本地提权的学习
    DataFrame的创建
    化肥厂废水除氨氮工艺盘点
    k8s 集群 使用yaml部署Tomcat方法
    Friedman检验和Nemenyi检验画图代码
    手写单例模式
    MySQL学习笔记8——游标
    redux中间件函数
    手敲Mybatis-SQL执行器
  • 原文地址:https://blog.csdn.net/weixin_46926189/article/details/136108058