Node.js中的fs模块:文件与目录操作(写入、读取、复制、移动、删除、重命名等)
在Node.js中,fs
模块提供了多种方法来处理文件和目录操作,使得数据的持久性保存和文件管理变得简单。下面将介绍文件读写、文件复制、文件移动、文件重命名、文件删除、文件夹创建与删除以及查看资源状态等常用操作。
首先,在使用写入和读取功能前,我们需要导入fs
模块,这是所有文件操作的基础:
const fs = require("fs");
一、文件写入
1. 异步写入
使用fs.writeFile
方法异步写入文件。例如,写入一个三字经文件:
fs.writeFile("./三字经.txt", "人之初,性本善。", (err) => {if (err) {console.log("写入失败");return;}console.log("写入成功");
});
console.log("异步写入操作已发起");
注意:console.log("异步写入操作已发起");
会在 writeFile
回调之前执行,因为 writeFile
是异步的。
2. 同步写入
如果需要同步执行,可以使用fs.writeFileSync
方法:
try {fs.writeFileSync("./data.txt", "text");console.log("同步写入成功");
} catch (err) {console.error("同步写入错误:", err);
}
console.log("同步写入操作已完成");
这里的console.log("
同步写入操作已完成");
会在writeFile
回调之后执行,因为writeFileSync
是同步的。
3. 异步追加写入
使用fs.appendFile
方法可以异步追加内容到文件末尾:
fs.appendFile("./三字经.txt", "性相近,习相远。", (err) => {if (err) {console.log("追加失败");return;}console.log("追加成功");
});
4、同步追加写入
同样,fs.appendFileSync
方法用于同步追加写入:
try {fs.appendFileSync("./data.txt", "\r\n追加text");console.log("同步追加成功");
} catch (err) {console.error("同步追加错误:", err);
}
5. 使用fs.writeFile
实现追加写入
通过设置flag: 'a'
选项,fs.writeFile
也可以用于追加写入:
fs.writeFile("./三字经.txt", "\r\n苟不教,父之过。", { flag: 'a' }, (err) => {if (err) {console.error("追加写入失败:", err);return;}console.log("追加写入成功");
});
6. 流式写入
对于大文件或需要持续写入的数据,使用流(stream)是一个更好的选择。使用fs.
createWriteStream创建一个写入流并写入数据:
const ws = fs.createWriteStream('./静夜思.txt');ws.write('窗前明月光,\r\n');
ws.write("疑是地上霜。\r\n");
ws.write("举头望明月,\r\n");
ws.write("低头思故乡。\r\n"); // 关闭流,确保数据完全写入文件ws.end(() => {console.log("流式写入完成");
});
//ws.close()
通常不需要显式调用ws.close()
来关闭写入流,因为close
方法不会等待数据被刷新到磁盘,可能会导致数据未完全写入文件。
可以使用ws.end()
,它会在数据写入完成后自动关闭流,确保数据完全写入文件。。
二、文件读取
1、异步读取
使用fs.readFile
方法可以异步读取文件内容。异步读取不会阻塞事件循环,这对于需要处理大量I/O操作的Node.js应用至关重要:
// 异步读取 radFile(这里以 "三字经.txt" 为例)
fs.readFile("./三字经.txt", (err, data) => {if (err) {console.log("读取失败");return;}console.log(data.toString());
});
2、同步读取
使用fs.readFileSync
方法可以实现文件的同步读取。但请注意,同步读取会阻塞事件循环,直到文件读取完成。因此,在实际应用中,尤其是服务器应用中,通常不推荐使用同步读取:
// 同步读取 radFileSync(这里以 "三字经.txt" 为例)let data = fs.readFileSync("./三字经.txt");console.log(data.toString());
3、流式读取
流式读取更加灵活高效,它可以逐块读取文件内容,而不是一次性将整个文件加载到内存中。这对于处理大文件非常有用
使用 fs.createReadStream
方法可以创建一个可读流。
// 流式读取 createReadStream(这里以 "三字经.txt" 为例)
const rs = fs.createReadStream('./三字经.txt');// 绑定data事件,每次读取到数据块时触发
rs.on('data', chunk => {console.log(chunk);// chunk 是一个 Buffer 对象,代表读取到的数据块// 处理文本文件时,可将Buffer对象转换为字符串:chunk.toString()
});// 绑定end事件,读取完成时触发
rs.on('end', () => {console.log("读取完成");
});// 绑定error事件,读取过程中发生错误时触发
rs.on('error', err => {console.error("读取错误:", err);
});
建议至少绑定 error
事件来避免未捕获的异常导致程序崩溃
三、文件复制
文件复制可以通过读取源文件内容并写入到目标文件来实现,也可以使用流来更高效地处理大文件。
1、同步复制
// 读取文件内容
let data = fs.readFileSync("./三字经.txt");
// 写入文件
fs.writeFileSync("./复制三字经.txt", data)
2、流式操作
占用内存空间更小,使用流更高效处理大文件
// 创建读取流对象
const rs = fs.createReadStream('./三字经.txt')
// 创建写入流对象
const ws = fs.createWriteStream('./复制三字经2.txt');
// // 绑定data事件
rs.on('data', chunk => {ws.write(chunk)
})// 或者使用 pipe() 方法const rs2 = fs.createReadStream('./三字经.txt');
const ws2 = fs.createWriteStream('./复制三字经3.txt');
rs2.pipe(ws2);
四、文件移动与重命名
使用fs.rename
或fs.renameSync
方法可以实现文件的移动和重命名。
1、异步操作
fs.rename("oldname.txt", "newname.txt", (err) => {if (err) {console.log("重命名失败");return;}console.log("重命名成功");
});fs.rename("path/to/oldfile.txt", "path/to/newfolder/newfile.txt", (err) => {if (err) {console.log("移动失败");return;}console.log("移动成功");
});
2、同步操作
fs.renameSync("oldname.txt", "newname.txt");fs.renameSync("path/to/oldfile.txt", "path/to/newfolder/newfile.txt");
五、文件删除
使用fs.unlink/fs.unlinkSync
或fs.rm/fs.rmSync
方法删除文件。
1、异步操作
fs.unlink("file.txt", (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// Node.js 14.14.0及以上版本可以使用fs.rmfs.rm("file.txt", (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});
2、同步操作
fs.unlinkSync("file.txt");fs.rmSync("file.txt");
六、查看资源状态
使用fs.stat
或fs.statSync
方法查看文件或目录的状态。
1、异步操作
fs.stat("file.txt", (err, stats) => {if (err) {console.log("获取状态失败");return;}console.log("操作成功", stats);// 资源状态console.log(stats.isFile()); // 是否为文件console.log(stats.isDirectory()); // 是否为目录
});
2、同步操作
const stats = fs.statSync("file.txt");
七、文件夹操作
1、创建文件夹
使用fs.mkdir
或fs.mkdirSync
方法创建文件夹,{ recursive: true }
用于递归创建:
fs.mkdir("newfolder", { recursive: true }, (err) => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});fs.mkdirSync("newfolderSync", { recursive: true });
2、读取文件夹
使用fs.readdir
或fs.readdirSync
方法读取文件夹内容。
fs.readdir("folder", (err, files) => {if (err) {console.log("读取失败");return;}console.log(files);
});const filesSync = fs.readdirSync("folder");
console.log(filesSync);
3、删除文件夹
使用fs.rmdir
或fs.rm
方法删除文件夹,{ recursive: true, force: true }
用于递归强制删除:
fs.rmdir("folder", { recursive: true }, (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// Node.js 14.14.0及以上版本fs.rm("folder", { recursive: true, force: true }, (err) => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});
相关文章:
Node.js中的fs模块:文件与目录操作(写入、读取、复制、移动、删除、重命名等)
在Node.js中,fs模块提供了多种方法来处理文件和目录操作,使得数据的持久性保存和文件管理变得简单。下面将介绍文件读写、文件复制、文件移动、文件重命名、文件删除、文件夹创建与删除以及查看资源状态等常用操作。 首先,在使用写入和读取功…...
代码的形状:重构的方向
大概2周前写了一篇《代码的形状:从外到内的探索与实践》 涵树:代码的形状:从外到内的探索与实践 觉得这个话题还可以继续,它是一个从无形到有形的过程,而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状ÿ…...
2021 年 3 月青少年软编等考 C 语言五级真题解析
目录 T1. 红与黑思路分析T2. 密室逃脱思路分析T3. 求逆序对数思路分析T4. 最小新整数思路分析T1. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的…...
华为C语言编程规范总结
1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此: 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件,…...
XML 解析器:深入解析与高效应用
XML 解析器:深入解析与高效应用 引言 XML(可扩展标记语言)作为一种重要的数据交换格式,被广泛应用于各种系统和平台中。为了有效地处理和解析XML数据,XML解析器发挥着至关重要的作用。本文将深入探讨XML解析器的原理…...
《系统爆破:MD5易破,后台登录可爆破?》
声明:笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 爆破Sales系统 一、爆破MD5 场景:已知MD5的加密字符串,如何得知明…...
基于微信小程序的书籍销售系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
SpringData-Redis缓存
Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。 NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言,键值存储代表NoSQL空间中最大…...
Hadoop3.3.4伪分布式环境搭建
文章目录 前言一、准备1. 下载Hadoop2. 配置环境变量3. 配置免密 二、Hadoop配置1. hadoop-env.sh2. hdfs-site.xml3. core-site.xml4. mapred-site.xml5. yarn-site.xml 三、格式化四、启动 前言 hadoop学习——伪分布式环境——普通用户搭建 一、准备 1. 下载Hadoop 2. 配…...
【VUE 指令学习笔记】
v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定。 v-for:遍历数组/对象/字符串 v-on:绑定事件监听,可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…...
【深度学习】布匹寻边:抓边误差小于3px【附完整链接】
布匹寻边 项目简介 布匹寻边是指布料裁剪过程中,通过AI寻边技术自动识别布匹的边缘,将检测到的边缘信息输出,确保裁剪的准确性,减少浪费,并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉,且误差小…...
【学习笔记】理解深度学习的基础:机器学习
1. 机器学习基础 1.1 机器学习的定义与重要性 定义:深度学习是机器学习的一种特定形式。为了深入理解深度学习,必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法,通过经验E在任务T上提高性能度量P(Mi…...
提升租赁效率的租赁小程序全解析
内容概要 在如今快节奏的生活中,租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业,都会因其便捷的功能而受益。简单来说,租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里,我们将带您畅游租赁小程序的海洋&a…...
Windows自动化Python pyautogui RPA操作
依赖包 import time import pyautogui import pyperclip import os import psutil from pywinauto.application import Application睡眠: pyautogui.sleep(1)鼠标事件: pyautogui.moveTo(100, 100, duration0.25) pyautogui.click(100, 100, duration0.…...
蓝桥杯_B组_省赛_2022(用作博主自己学习)
题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…...
RK3568 Android 13 内置搜狗输入法小计
问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall)…...
单片机Day1
目录 一.什么是单片机? 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型: 专用型: 按处理的二进制位可以分为: 六.应用: 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …...
《机器学习》之贝叶斯(Bayes)算法
目录 一、前言 二、贝叶斯算法原理解析 1、贝叶斯公式 2、朴素贝叶斯算法 3、计算步骤 4、例题: (1)、 计算先验概率 (2)、计算条件概率 (3)、计算后验概率 (4)…...
Redis实现高效的负载均衡算法
1. Redis存储设计 我们需要在 Redis 中存储以下信息: 配置列表(List<Config>):存储所有配置项。总权重:存储所有配置的总权重。当前轮询状态:存储当前的轮询状态(如当前随机值或索引&am…...
虚拟文件系统 VFS
目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口: VFS定义了一组标准的文件操作API,如open(), read(), write(), close()等,使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…...
基于Android的民宿租赁系统的设计与实现
博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...
数据链路层-STP
生成树协议STP(Spanning Tree Protocol) 它的实现目标是:在包含有物理环路的网络中,构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机: 选举根端口: 选举指定端口: 端口名字&…...
OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅
《OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代,数据量呈爆炸式增长,业务对数据库的性能、可靠性和扩展性提出了前所未有的要求。OceanBase作为一款极具创新性的分布式数据库,正逐…...
tensor core实现flash_attn_mma_share_kv源码分析
一 源码分析 1.1 函数入口 void flash_attn_mma_stages_split_q_shared_kv(torch::Tensor Q, torch::Tensor K, torch::Tensor V, torch::Tensor O, int stages) {CHECK_TORCH_TENSOR_DTYPE(Q, torch::kHalf) // Q [B,H,N,D]CHECK_TORCH_TENSOR_DTYPE(K, torch::kHalf) // K …...
【源码解析】Java NIO 包中的 MappedByteBuffer
文章目录 1. 前言2. MappedByteBuffer3. 例子4. 属性5. 构造器6. mappingOffset、mappingAddress、mappingLength7. isLoaded 判断内存是否还在内存中8. load 方法将 ByteBuffer 加载到 Page Cache 中9. force 刷盘 1. 前言 上一篇文章我们介绍了 HeapByteBuffer 的源码&#…...
【Docker系列】容器内目录显示异常的解决之道
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
echarts:dataZoom属性横向滚动条拖拽不生效
问: 拖拽的过程中,第一次向右拖拽正常,然后就报错: echarts报错: var pointerOption pointerShapeBuilder[axisPointerType](axis,pixeValue,otherExtent),(axis,pixeValue,otherExtent)下划线红色报错:…...
25/1/12 算法笔记 剖析Yolov8底层逻辑
YOLOv8 是一种基于深度学习的目标检测和图像分割模型,属于 YOLO(You Only Look Once)系列的最新版本。YOLO 系列模型以其高效的实时目标检测能力而闻名,YOLOv8 在此基础上进行了一些优化和改进。 Yolov8的主要特点: …...
Python双指针
双指针 双指针:在区间操作时,利用两个下标同时遍历,进行高效操作 双指针利用区间性质可以把 O ( n 2 ) O(n^2) O(n2) 时间降低到 O ( n ) O(n) O(n) 反向扫描 反向扫描: l e f t left left 起点,不断往右走&…...
1、docker概念和基本使用命令
docker概念 微服务:不再是以完整的物理机为基础的服务软件,而是借助于宿主机的性能。以小量的形式,单独部署的应用。 docker:是一个开源的应用容器引擎,基于go语言开发的,使用时apache2.0的协议。docker是…...
重庆网站制作公司 /电话营销话术
对于一个 Linux 驱动使一个进程睡眠是一个容易做的事情. 但是, 有几个规则必须记住以安全的方式编码睡眠. 这些规则的第一个是: 当你运行在原子上下文时不能睡眠. 我们在第 5 章介绍过原子操作; 一个原子上下文只是一个状态, 这里多个步骤必须在没有任何类型的并发存取的情况下…...
网站维护一般多久/百度小说风云榜2022
思路:利用列表存储 在使用reverse()函数。 a input().split() #输入字符和维度 li1 [] for i in range(int(a[1])):li1.append(input()) #将福字每一行的字符存入列表 s1 "".join(li1) #将福…...
做网站的故意给中病毒/软文推广的优点
文章目录MyBatis-Plus特性快速开始项目整体目录结构数据库准备配置文件简单CRUD通用service源码下载MyBatis-Plus 官网 个人白话解释:简单的CRUD直接通过方法调用,无需多写接口和xml,像jpa那样调用 愿景 我们的愿景是成为 MyBatis 最好的搭档…...
传奇网站怎么做/域名交易平台
常用指令 在vue中提供了一些对于页面 数据的更为方便的输出,这些操作就叫做指令,指令中封装了一些DOM行为, 结合属性作为一个暗号, 暗号有对应的值,根据不同的值,框架会进行相关DOM操作的绑定 vue中的指令有很多,我们平时做项目常用的有&am…...
阅读转发网站那些做的比较好/天津网站快速排名提升
板子,全是板子 该模板目前行数(Markdown下包括文字):4799 行 更新日志(从2018.11.19开始) 2019.04.05 : 更新了数据结构->左偏树 2019.04.02 : 更新了数据结构->平衡树->WBLT 2019.03.26 : 更新了…...
哈尔滨网站建设费用/成都搜狗seo
文件透明加密这点事儿,从2001年开始出现基于API HOOK的方式开始到现在,已经十几年了,有细心人按技术实现的方式将其细分为4代,分别是基于API HOOK的第一代技术、基于文件过滤驱动(加清缓存)的第二代技术、使…...