2-Node.js <fs模块>

一、简介

  1. fs是什么? fs : file system 文件系统
  2. fs模块可以实现与硬盘的交互,例如:文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作。

二、fs文件写入

1. 写入过程

(1)步骤:

  • step1:创建fs对象
  • step2:写入文件

(2)两个函数

  • require(id)
    • 全局函数,可以用来导入模块
    • id:module name or path 字符串类型
  • fs.writeFile(file,data[,options],callback) 是异步写入
    • file:文件名
    • data:数据,往文件里写入什么内容
    • options:选项配置对象,可选参数
    • callback:回调参数,当写入完成之后会自动调用回调函数,当写入失败把错误传递给回调函数参数;当写入成功把null传递给回调参数

(3)示例:新建一个文件,座右铭.txt,写入内容:三人行,则必有我师焉

//1. 导入fs模块 
const fs = require('fs');

//2.写入文件
fs.writeFile('座右铭.txt','三人行,则必有我师焉',err => {
  //err有值,是个错误对象
    if(err){
        console.log(err);
        console.log('写入失败');
        return;
    }
    console.log('chengg')
});
2. fs异步与同步(两种工作模式)
//异步写入:writeFileSync参数和writeFile参数基本一样,就是没有最后一个回调函数参数,异步写入效率更高
fs.writeFileSync('data.txt','测试');
3. fs追加写入

appendFile() / appendFileSyn() : 参数同上

//1. 引入fs模块
const fs = require('fs');

//2. 调用 appendFile 
let str = '则其善者而从之,其不善者而改之';
fs.appendFile('座右铭.txt',str,err => {
    if(err){
        console.log("错误");
        return;
    }
    console.log('成功');
});

//3. writeFile() 也可以追加写入,通过配置对象{flag:'a'}
let str1 = ',\r\n温故而知新,可以为师矣!';
fs.writeFile('座右铭.txt',str1,{flag:'a'},err => {
    if(err){
        console.log(err);
        return;
    }
    console.log('成功!');
})
4. fs 流式写入

更适合写入频次较高的场景,也适合大文件的写入。

//1. 导入
const fs = require('fs');

//2. 创建一个写入流对象
//相当于和文件建立了一个通道,什么时候想写入内容,传入内容即可
const ws = fs.createWriteStream('观书有感.txt');

//3. 写内容
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠哪得清如许\r\n');
ws.write('为有源头活水来\r\n');

//4. 关闭通道
ws.close();

【文件写入应用场景】

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

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

三、fs文件读取

1. 读取方法
  • 异步读取方法: fs.readFile(path[,options],callback)
    • path:路径
    • options:选项配置对象,可选参数
    • callback:回调函数,两个形参 err:接受错误信息 data:接收读取的文件内容
  • 同步读取方法 : fs.readFileSync(path);
    • 参数:path
    • 返回值是读取到的数据
2. 应用场景
  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放音乐视频
  • Git查看日志
  • 上传文件
  • 查看聊天记录
3. fs流式读取
  //1. 引入fs模块 
  const fs = require('fs');

  //2. 创建读取流
  //createReadStream 接受路径参数
  const rs = fs.createReadStream('附件.pdf');

  //3. 为读取流对象绑定data事件,用于获取读取到的数据
  //chunk:块儿   即读取到的数据块
  //每读取一次,回调函数就会执行一次
  rs.on('data',chunk => {
      console.log(chunk);
      console.log(chunk.length);   // 每次最多读取65536字节 => 64KB
  });

  //4. end 可选事件,不一定非要绑定
  //当读取流读取完所有的内容之后,会触发 end 事件
  rs.on('end', () => {
      console.log("读取完成!");
  })
4. 练习:复制文件
  //需求:复制 附件.pdf 文件
  //方式一:readFile
  const fs = require('fs');
  let data = fs.readFileSync('附件.pdf');
  //写入文件
  fs.writeFileSync('附件副本.pdf',data);

  //方式二:流式操作
  const rs = fs.createReadStream('附件.pdf');
  const ws = fs.createWriteStream('附件2.pdf');
  rs.on('data',chunk => {
      ws.write(chunk);
  })

  //方式二可以直接简写
  rs.pipe(ws);

四、fs文件重命名与移动

1. 方法
  • fs.rename(oldPath,newPath,callback) 异步
  • fs.renameSync(oldPath,newPath) 同步
2. 使用
const fs = require('fs');

fs.rename('./座右铭.txt','./论语.txt',err => {
    if(err){
        console.log(err);
        return;
    }
    console.log("成功");
})

五、文件删除

1. 方法
  • fs.unlink(path,callback) 异步删除 --> 同步:fs.unlinkSync(path)
  • fs.rm(path,callback) 异步删除 --> 同步:fs.rmSync(path)
2. 示例
//1. 引入fs模块
const fs = require('fs');

2. unlink方法删除
fs.unlink('./附件2.pdf',err => {
    if(err){
        console.log("删除出错");
        return;
    }
    console.log("成功");
})

//3. rm方法删除  nodejs 14.4引入的新方法
fs.rm('./附件副本.pdf',err => {
    if(err){
        console.log("删除出错");
        return;
    }
    console.log("成功");
})

六、文件夹操作

1. 方法
  • 创建文件夹:mkdir(path[,options],callback)/mkdirSync
  • 读取文件夹:readdir(path,callback)/readdirSync
    • path文件夹路径
    • callback两个参数:err,data。data是文件夹内容的名称数组。
  • 删除文件夹:rmdir(path[,options],callback)/rmdirSync/rm
    • rmdir递归删除时会发生警告。递归删除推荐使用 rm
2. 代码
//1. 导入fs模块
const fs = require('fs');

//2. 创建文件夹
//-----------1)创建一个单独的文件夹
fs.mkdir('./新文件夹',err=> {
    if(err){
        console.log("失败!");
        return;
    }
    console.log("创建成功!");
})

//----------2)递归创建
fs.mkdir('./a/b/c',{recursive:true},err=> {
    if(err){
        console.log("失败!");
        return;
    }
    console.log("创建成功!");
})

//3. 读取文件夹
fs.readdir('../nodejs_code',(err,data) => {
    if(err){
        console.log("读取错误");
        return;
    }
    console.log(data);
})

//4. 删除文件夹
//递归删除:建议使用rm()
fs.rm('./a',{recursive:true},err => {
    if(err){
        console.log("错误");
        return;
    }
    console.log("成功");
})

七、查看资源状态

1. 方法
  • fs.stat(path[,options],callback);
  • fs.statSync
2. 代码
//1. 导入
const fs = require('fs');

//2. 查看资源状态
fs.stat('./观书有感.txt',(err,data) => {
    if(err){
        console.log("出错");
        return;
    }
    // console.log(data);

    //isFile() 查看资源是不是文件类型,返回值是布尔型
    console.log(data.isFile());

    //isDirectory() 检测目标资源是不是文件夹
    console.log(data.isDirectory());
})

八、fs路径

1. 路径的写法有两种
  • 相对路径
  • 绝对路径
2. fs相对路径的bug

  fs模块相对路径参照物:不是js文件的所在目录,而是命令行的工作目录。

fs.writeFileSync('./index.html','love');
//  ./ 当前目录指的是命令行的工作目录
3. __dirname

  可以理解为全局变量,始终保存所在文件的所在目录的绝对路径。

fs.writeFileSync(__dirname + '/index.html','love');

九、练习

//需求:吧0-9前面加0
//1. 导入fs模块  
const fs = require('fs');

//2. 读取文件夹
const files = fs.readdirSync('./');

//3. 遍历数组
files.forEach(item => {
    //判断第一位是否小于10
    let data = item.split('-');
    //解构赋值
    let [index,name] = data;
    if(Number(index) < 10 && Number(index) != NaN){
        name = "0" + index + '-' + name;
        fs.renameSync(`./${item}`,`./${name}`);
    }
})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值