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. 写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉',err =>
// err写入失败:错误对象 写入成功:nul1
if(err){
console.1og('写入失败')return;
console.1og('写入成功')}
);
console.log(1+1);

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

1.2 同步和异步

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

  2. 同步执行

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

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

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.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.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());

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('读取完成');
}

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) // 了解即可 也是一种文件写入流

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('操作成功');
});

在这里插入图片描述

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('删除成功)})

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('创建成功')})

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);
})

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('删除成功);
})

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() => 查看是否为文件夹
})

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'); 报错 权限不允许

7.2 相对路径的bug

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

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

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

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

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}`);
})

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

答案在资料中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

crossover和wine哪个好 wine和crossover有什么本质区别 苹果电脑运行Windows crossover24

CrossOver是Wine的延伸产品&#xff0c;CrossOver可以简单的理解为类虚拟机&#xff0c;那么wine是什么&#xff0c;许多小伙伴就可能有些一知半解。CrossOver和wine哪个好&#xff0c;wine和CrossOver有什么本质区别呢&#xff1f;下文将围绕着这两个问题展开。 一、CrossOve…

tcp inflight 守恒算法的几何解释

接上文&#xff1a;tcp inflight 守恒算法背后的哲学 在 tcp inflight 守恒算法正确性 中&#xff0c;E bw / srtt 的公平最优解是算出来的&#xff0c;如果自然可以用数学描述&#xff0c;那能算出来的东西反过来也一定能通过直感看出来&#xff0c;我倾向于用几何和力学描述…

力扣HOT100 - 199. 二叉树的右视图

解题思路&#xff1a; 相当于层序遍历&#xff0c;然后取每一层的最后一个节点。 class Solution {public List<Integer> rightSideView(TreeNode root) {if (root null) return new ArrayList<Integer>();Queue<TreeNode> queue new LinkedList<>…

Pushmall智能AI数字名片— —寻求商机合作的营销推广平台

Pushmall智能AI数字名片— —寻求商机合作的营销推广平台 开发计划 2024年2月开发计划&#xff1a; 1、优化名片注册、信息完善业务流程&#xff1b; 2、重构商机信息&#xff1a;供应信息、需求信息发布。 3、会员名片服务优化 4、企业名片&#xff1a;员工管理优化 5、CRM客…

【计算机网络】网络模型

OSI七层网络模型 七层模型如图所示 每层的概念和功能 物理层 职责&#xff1a;将数据以比特为单位&#xff0c;通过不同的传输介质将数据传输出去。 主要协议&#xff1a;物理媒介相关的协议&#xff0c;如RS232&#xff0c;V.35&#xff0c;以太网等。 数据链路层 职责&…

【WSL报错】执行:wsl --list --online;错误:0x80072ee7

【WSL报错】执行:wsl --list --online&#xff1b;错误:0x80072ee7 问题情况解决方法详细过程 问题情况 C:\Users\17569>wsl --list --online 错误: 0x80072ee7 解决方法 开系统代理&#xff0c;到外网即可修复&#xff01;&#xff01;&#xff01;&#xff01;&#x…

电商市场已饱和,各大平台都在卷价格?那是你不了解视频号小店

大家好&#xff0c;我是电商笨笨熊 现在做电商除了疯狂内卷就是疯狂内卷&#xff1b; 各大平台都是内卷价格&#xff0c;嘴上说着不想成为拼多多一样的平台&#xff0c;实际做的却是低价再低价&#xff0c;都希望能通过低价吸引用户提高转化&#xff1b; 因此现在很多玩家对…

第十四章大数据和数据科学4分

14.1 引言 14.1.3 科学理念 1.数据科学 数据科学将数据挖掘、统计分析和机器学习与数据集成整合&#xff0c;结合数据建模能力&#xff0c;去构建预测模型、探索数据内容模式。 数据科学依赖于&#xff1a; 1&#xff09;丰富的数据源。具有能够展示隐藏在组织或客户行为中不…

jpa分页插件对象Pageable出现了错误异常如何解决?

jpa分页插件对象Pageable出现了错误异常如何解决&#xff1f;&#xff01; 一般来说&#xff0c;遇到这种的错误异常情况&#xff0c;通常情况 下&#xff0c;都是因为程序员把传递的分页页码数字写错了。 正常情况下&#xff0c;分页页码起始数字应该是0&#xff1b;而不是1…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

揭开ChatGPT面纱(2):OpenAI主类源码概览

文章目录 〇、使用OpenAI的两个步骤一、初始化方法__init__()1.源码2.参数解析 二、提供的接口1.源码2.接口说明主要接口说明 OpenAI版本1.6.1 〇、使用OpenAI的两个步骤 在上一篇博客中&#xff0c;我实现并运行了一个OpenAI的demo&#xff0c;我们可以发现&#xff0c;想要使…

Unity的旋转实现一些方法总结(案例:通过输入,玩家进行旋转移动)

目录 1. Transform.Rotate 方法 使用 2. Transform.rotation 或 Transform.localRotation 属性与四元数 使用方式&#xff1a; 小案例 &#xff1a;目标旋转角度计算&#xff1a;targetRotation&#xff08;Quaternion类型&#xff09; 玩家发现敌人位置&#xff0c;玩家…

ubuntu20 中设置桌面背景任务

1. 下载conky 使用 Conky 在 Ubuntu 中显示信息&#xff0c;例如你的阅读计划&#xff0c;可以分几个步骤来完成。Conky 是一款灵活的轻量级系统监视器&#xff0c;能够在桌面上显示各种信息。以下是基本的设置步骤&#xff1a; 安装 Conky 首先&#xff0c;你需要在 Ubuntu…

【学习记录】autoware标定相机与激光雷达外参

一、autoware选择 这里踩了好几个坑&#xff0c;首先autoware作为一个无人驾驶知名框架&#xff0c;其内部实际上是有两套标定的东西的&#xff0c;这一点绝大多数博客没有提到。其中最常用的是一个叫标定工具箱的东西&#xff0c;这个ros包已经在1.10往后的版本中被删掉了&am…

Spring 1、初识Spring

初识Spring 了解Spring家族了解Spring发展史Spring Framework系统架构学习路线 了解Spring家族 官网spring.io Spring形成了一种开发的生态圈&#xff0c;Spring提供了若干个项目&#xff0c;每个项目用于完成特定的功能。 Spring Framework&#xff08;最基础的东西&#x…

SpringCloud Alibaba--nacos配置中心

目录 一.基础介绍 1.1概念 1.2 功能 二.实现 2.1 依赖 2.2 新建配置文件 2.3 克隆 2.4 配置bootstap.yml文件 三.测试 一.基础介绍 1.1概念 在微服务架构中&#xff0c;配置中心就是统一管理各个微服务配置文件的服务。把传统的单体jar包拆分成多个微服务后&#xf…

跨越未知,拥抱挑战——新征程

在浩瀚的IT领域里&#xff0c;每一位开发工程师都如同一位探险家&#xff0c;不断地探索、挑战和成长。作为一名新入职的Java开发工程师&#xff0c;我面临着全新的技术栈和业务领域&#xff0c;这是一次跨越未知的征程&#xff0c;也是一次自我提升的机会。 新入职 初入公司…

低代码开发之腾讯云微搭工具

低代码开发之腾讯云微搭工具 微搭简介诞生缘由开发模式如何创建组件模块介绍实例讲解url传参级联联动使用事件其他方法调用数据源方法 callDataSource触发流程 callProcess 数据模型方法V2 微搭简介 微搭&#xff08;WeDa&#xff09;&#xff0c;全称是腾讯云微搭低代码开发平…

Powershell 一键安装 virtio_qemu_agent

前言 qemu-guest-agent qemu-guest-agent是一个助手守护进程,安装在客户机中。它用于在主机和客户端之间交换信息,并在客户端执行命令。 在Proxmox VE中,qemu-guest-agent主要用于三件事: 正确关闭客户机,而不是依赖于ACPI命令或windows策略在进行备份/快照时冻结客户机…

plt.show()输出<Figure size 1200x800 with 1 Axes>没有展示出图片在notebook里

解决方法如下&#xff1a; 在Jupyter Notebook中&#xff0c;如果使用plt.show()没有直接显示图像&#xff0c;可能是由于某些设置或限制导致的。您可以尝试使用%matplotlib inline魔术命令来确保图像能够直接显示在Notebook中。请在Notebook的第一个单元格中执行以下命令&…