• Node.js -- fs模块


    文章目录

    • 1. 写入文件
      • 1.1 写入文件
      • 1.2 同步和异步
      • 1.3 文件追加写入
      • 1.4 流式写入
      • 1.5 文件写入的场景
    • 2. 读取文件
      • 2.1 异步和同步读取
      • 2.2 读取文件应用场景
      • 2.3 流式读取
      • 2.4 fs 练习 -- 文件复制
    • 3. 文件重命名和移动
    • 4. 文件删除
    • 5. 文件夹操作
      • 5.1 创建文件夹
      • 5.2 读取文件夹
      • 5.3 删除文件夹
    • 6. 查看资源状态
    • 7. 资源路径
      • 7.1 路径使用
      • 7.2 相对路径的bug
      • 7.3 fs 练习 -- 批量重命名

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

    1. 写入文件

    1.1 写入文件

    1. 导入fs 模块
    const fs = require('fs');
    
    • 1
    1. 写入文件
    fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err =>
    // err写入失败:错误对象 写入成功:nul1
    if(err){
    console.1og('写入失败')return;
    console.1og('写入成功')}
    );
    console.log(1+1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    // 2
    // 写入成功
    在这里插入图片描述
    其实,我们平常文件的保存也是使用了node 的fs 模块!

    1.2 同步和异步

    1. 异步执行
      上面我们在学习写入模块时举出的案例就时是异步编程,程序会先输出2 的原因是js 文件从上之下执行,写入文件时时异步执行,就像但与我们之前学过的setTimeOut 定时器。

    2. 同步执行

    fs.writeFileSync('./data.txt','test');
    // 这种方法没有回调函数
    
    • 1
    • 2

    此时程序没有其他线程,只能等这步代码执行完之后再进行下面的程序。

    1.3 文件追加写入

    // 第一种方法
    fs.appendFile('./座右铭.txt','择其善者而从之,择期不善者而改之',err=>{
    //判断
    if(err){
    console.log('写入失败');
    return;
    }
    console.log('追加写入成功');
    });
    // 第二种方法
    fs.appendFileSync('./座右铭.txt','择其善者而从之,择期不善者而改之')
    // 第三种方法
    fs.appendFile('./座右铭.txt','love love love'{flag: 'a'},err=>{
    //判断
    if(err){
    console.log('写入失败');
    return;
    }
    console.log('\r\n追加写入成功'); // \r\n 表示换行
    });
    // 这种方法我们一般在日志使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.4 流式写入

    // 1.导人fs
    const fs = require('fs');
    // 2.创建写入流对象
    const ws = fs.createWriteStream('./观书有感.txt');
    // 3.write
    ws.write('半亩方塘一鉴开r\n');
    ws.write('天光云影共徘徊\r\n');
    ws.write('间渠那得清如许r\n');
    ws.write('为有源头活水来\r\n');
    // 4.关闭通道
    ws.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    之前讲过的写入文件方式都是调用一次方法写入一次,会消耗资源,而这种方法的优势就是在没有关闭通道的时候,可以一直向文件中写入内容。

    1.5 文件写入的场景

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

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

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

    2. 读取文件

    2.1 异步和同步读取

    语法: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());
    )
    })
    
    // 3.同步读取
    let data = fs.readFileSync('./观书有感.txt');
    console.log(data.toString());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2 读取文件应用场景

    • 电脑开机
    • 程序运行
    • 编辑器打开文件
    • 查看图片
    • 播放视频
    • 播放音乐
    • Git 查看日志
    • 上传文件
    • 查看聊天记录

    2.3 流式读取

    流式读取就是相当于把文件分成了若干块儿,一次读取若干块儿内容。

    // 1.引入fs模块
    const fs = require('fs');
    // 2.创建读取流对象
    const rs = fs.createReadStream('../资料/笑看风云.mp4');
    // 3.绑定data事件
    // chunk --> 块儿 大块儿
    rs.on('data',chunk => {
    console.log(chunk)
    console.log(chunk.length);// 65536字节 = 64KB
    // console.log(chunk.toString()); // 视频信号不是以字符串的形式存储的,这样强制使用UTF-8 形式输出的内容会乱码
    });
    //
    console.log(chunk.toString());// 65536 = 64KB
    ):
    // 4.end可选事件
    rs.on('end',()=>{
    console.1og('读取完成');
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.4 fs 练习 – 文件复制

    // 方式一 readFile
    const fs = require('fs');
    // 读取文件内容
    // let data = fs.readFileSync('../资料/笑看风云.mp4');
    // 写入文件
    // fs.writeFileSync('../资料/笑看风云-2.mp4',data);
    console.log(process.memoryUsage());// rss => 整个文件大小 => 110718784字节 => 105MB
    // process.memoryUsage() 获取文件内存
    
    // 方式二 流式操作
    // 创建读取流对象
    const rs = fs.createReadStream('./资料/笑看风云.mp4');
    // 创建写入流对象
    const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');
    // 绑定data事件
    rs.on('data',chunk => {ws.write(chunk);
    });
    rs.on('end',()=>
    console.log(process.memoryUsage());//43106304 => 41MB
    })
    rs.pipe(ws) // 了解即可 也是一种文件写入流
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3. 文件重命名和移动

    // 文件重命名
    // 1.导入fs模块
    const fs = require('fs');
    // 2.调用rename方法
    fs.rename('./座右铭.txt','./论语.txt',err=>{if(err){
    console.log('操作失败~');
    return;
    }
    console.log('操作成功');
    });
    
    // 文件移动
    fs.rename('./data.txt','../资料/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

    在这里插入图片描述

    4. 文件删除

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

    5. 文件夹操作

    5.1 创建文件夹

    // 1.导入fs模块
    const fs require('fs');
    
    //第一种方法
    // 2.创建文件夹mk make制作dir directory文件夹
    fs.mkdir('./html',err =>
    if(err){
    console.1og('创建失败~');
    return;
    }
    console.1og('创建成功');
    })
    
    // 第二种方法 递归创建
    fs.mkdir('./a/b/c',{recursive: true},err =
    if(err){
    console.1og('创建失败~')return;
    }
    console.1og('创建成功')})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    5.2 读取文件夹

    //2-3读取文件夹
    // read 读取 dir directory 文件夹
    fs.readdir('./资料'(err,data)=>{
    if(err){
    console.1og('读取失败');
    return;
    }
    console.log(data);
    })
    
    fs.readdir('./',(err,data) => {
    if(err){
    console.1og('读取失败');
    return
    }
    console.log(data);
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5.3 删除文件夹

    // rm => remove 
    fs.rmdir('./html',err =
    if(err){
    console.1og('删除失败');
    return;
    console.log('删除成功');
    });
    
    // 递归删除
    // 文件夹不为空时无法删除
    // 不建议使用
    fs.rmdir('./a',{recursive:true},err =
    if(err){
    console.log(err);
    return;
    console.1og('删除成功');
    });
    
    //建议使用
    fs.rm('./a',{recursive:true},err =
    if(err){
    console.log(err);
    return;
    console.1og('删除成功);
    })
    
    • 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

    6. 查看资源状态

    // 1.导入fs模块
    const fs require('fs');
    // 2.stat方法status缩写状态
    fs.stat('./资料/笑看风云.mp4',(err,data)
    =>{
    if(err){
    console.1og('操作失败')return;
    }
    console.log(data);
    // data.file() => 查看是否为文件
    // data.isDirectory() => 查看是否为文件夹
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7. 资源路径

    在这里插入图片描述

    7.1 路径使用

    // 1.导入fs模块
    const fs require('fs');
    
    // 相对路径
    // 当前文件夹
    fs.writeFileSync('./index.html','love');
    // fs.writeFileSync('index.html','love');
    // 上一级文件夹
    fs.writeFileSync('../index.html','love');
    
    //绝对路径
    fs.writeFilesync('D:/index.html','love');
    // fs.writeFileSync('C:/index.html','love'); 报错 权限不允许
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    7.2 相对路径的bug

    现有文件夹目录如下:
    在这里插入图片描述
    执行以下代码:

    const fs = require('fs');
    fs.writeFileSync('./index.html','love');
    
    • 1
    • 2

    在这里插入图片描述
    为什么index.html 创建在了代码的同级目录下呢?这是因为相对路径的参照物是命令行的工作目录
    在这里插入图片描述
    要解决这个问题就要转换为绝对路径:
    我们每次去写绝对变量都需要写好长一段,但是使用__dirname(可以理解为全局变量,保存的是所在文件的所在目录的绝对路径)

    console.log(__dirname);
    fs.writeFileSync(__dirname + '/index.html','love');
    
    • 1
    • 2

    7.3 fs 练习 – 批量重命名

    const fs = require('fs');
    const files fs.readdirSync('./code');
    // 遍历数组
    files.forEach(item =>{
    // 拆分文件名
    let data = item.split('-');
    let [num,name] = data;
    // 判断
    if(Number(num) < 10){
    num = '0' + num;
    //创建新的文件名
    let newName = num +'-' +name;
    //重命名
    fs.renameSync(`./code/${item}`,`./code/${newName}`);
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    思考:
    如果将02 文件删除,那么怎么将文件名称03变02,以此类推将下面所有的文件名称修改,接着排序。

    答案在资料中。

  • 相关阅读:
    微信小程序踩坑记录
    内存管理:C/C++开发中的malloc函数的实现原理
    权限、认证与授权
    #ACCV2022还有两周截稿#疫情过后期待相聚澳门,相邀参与亚洲视觉盛会
    HCIE-HCS规划设计搭建
    PIC16C程序调用汇编程序的问题
    Leetcode 剑指 Offer II 049. 求根节点到叶节点数字之和
    算法竞赛进阶指南 0x57 倍增优化DP
    所谓的35岁中年危机只不过是在还曾经的债、填曾经的坑罢了~
    Linux上通过mysqldump命令实现自动备份
  • 原文地址:https://blog.csdn.net/2302_79523175/article/details/138021511