当前位置: 首页 > news >正文

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.renamefs.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.unlinkSyncfs.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.statfs.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.mkdirfs.mkdirSync方法创建文件夹,{ recursive: true }用于递归创建:

fs.mkdir("newfolder", { recursive: true }, (err) => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});fs.mkdirSync("newfolderSync", { recursive: true });

2、读取文件夹

使用fs.readdirfs.readdirSync方法读取文件夹内容。

fs.readdir("folder", (err, files) => {if (err) {console.log("读取失败");return;}console.log(files);
});const filesSync = fs.readdirSync("folder");
console.log(filesSync);

3、删除文件夹

使用fs.rmdirfs.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周前写了一篇《代码的形状:从外到内的探索与实践》 涵树:代码的形状:从外到内的探索与实践 觉得这个话题还可以继续,它是一个从无形到有形的过程,而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状&#xff…...

2021 年 3 月青少年软编等考 C 语言五级真题解析

目录 T1. 红与黑思路分析T2. 密室逃脱思路分析T3. 求逆序对数思路分析T4. 最小新整数思路分析T1. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的…...

华为C语言编程规范总结

1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此: 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件&#xff0c…...

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&#xff09…...

单片机Day1

目录 一.什么是单片机? 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型: 专用型: 按处理的二进制位可以分为: 六.应用: 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …...

《机器学习》之贝叶斯(Bayes)算法

目录 一、前言 二、贝叶斯算法原理解析 1、贝叶斯公式 2、朴素贝叶斯算法 3、计算步骤 4、例题: (1)、 计算先验概率 (2)、计算条件概率 (3)、计算后验概率 (4)…...

Redis实现高效的负载均衡算法

1. Redis存储设计 我们需要在 Redis 中存储以下信息&#xff1a; 配置列表&#xff08;List<Config>&#xff09;&#xff1a;存储所有配置项。总权重&#xff1a;存储所有配置的总权重。当前轮询状态&#xff1a;存储当前的轮询状态&#xff08;如当前随机值或索引&am…...

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…...

基于Android的民宿租赁系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…...

数据链路层-STP

生成树协议STP&#xff08;Spanning Tree Protocol&#xff09; 它的实现目标是&#xff1a;在包含有物理环路的网络中&#xff0c;构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机&#xff1a; 选举根端口&#xff1a; 选举指定端口&#xff1a; 端口名字&…...

OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅

《OceanBase环境搭建与熟悉全攻略&#xff1a;开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代&#xff0c;数据量呈爆炸式增长&#xff0c;业务对数据库的性能、可靠性和扩展性提出了前所未有的要求。OceanBase作为一款极具创新性的分布式数据库&#xff0c;正逐…...

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系列】容器内目录显示异常的解决之道

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

echarts:dataZoom属性横向滚动条拖拽不生效

问&#xff1a; 拖拽的过程中&#xff0c;第一次向右拖拽正常&#xff0c;然后就报错&#xff1a; echarts报错&#xff1a; var pointerOption pointerShapeBuilder[axisPointerType](axis,pixeValue,otherExtent),(axis,pixeValue,otherExtent)下划线红色报错&#xff1a;…...

25/1/12 算法笔记 剖析Yolov8底层逻辑

YOLOv8 是一种基于深度学习的目标检测和图像分割模型&#xff0c;属于 YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本。YOLO 系列模型以其高效的实时目标检测能力而闻名&#xff0c;YOLOv8 在此基础上进行了一些优化和改进。 Yolov8的主要特点&#xff1a; …...

Python双指针

双指针 双指针&#xff1a;在区间操作时&#xff0c;利用两个下标同时遍历&#xff0c;进行高效操作 双指针利用区间性质可以把 O ( n 2 ) O(n^2) O(n2) 时间降低到 O ( n ) O(n) O(n) 反向扫描 反向扫描&#xff1a; l e f t left left 起点&#xff0c;不断往右走&…...

1、docker概念和基本使用命令

docker概念 微服务&#xff1a;不再是以完整的物理机为基础的服务软件&#xff0c;而是借助于宿主机的性能。以小量的形式&#xff0c;单独部署的应用。 docker&#xff1a;是一个开源的应用容器引擎&#xff0c;基于go语言开发的&#xff0c;使用时apache2.0的协议。docker是…...

重庆网站制作公司 /电话营销话术

对于一个 Linux 驱动使一个进程睡眠是一个容易做的事情. 但是, 有几个规则必须记住以安全的方式编码睡眠. 这些规则的第一个是: 当你运行在原子上下文时不能睡眠. 我们在第 5 章介绍过原子操作; 一个原子上下文只是一个状态, 这里多个步骤必须在没有任何类型的并发存取的情况下…...

网站维护一般多久/百度小说风云榜2022

思路&#xff1a;利用列表存储 在使用reverse()函数。 a input().split() #输入字符和维度 li1 [] for i in range(int(a[1])):li1.append(input()) #将福字每一行的字符存入列表 s1 "".join(li1) #将福…...

做网站的故意给中病毒/软文推广的优点

文章目录MyBatis-Plus特性快速开始项目整体目录结构数据库准备配置文件简单CRUD通用service源码下载MyBatis-Plus 官网 个人白话解释&#xff1a;简单的CRUD直接通过方法调用&#xff0c;无需多写接口和xml&#xff0c;像jpa那样调用 愿景 我们的愿景是成为 MyBatis 最好的搭档…...

传奇网站怎么做/域名交易平台

常用指令 在vue中提供了一些对于页面 数据的更为方便的输出,这些操作就叫做指令&#xff0c;指令中封装了一些DOM行为, 结合属性作为一个暗号, 暗号有对应的值,根据不同的值&#xff0c;框架会进行相关DOM操作的绑定 vue中的指令有很多&#xff0c;我们平时做项目常用的有&am…...

阅读转发网站那些做的比较好/天津网站快速排名提升

板子&#xff0c;全是板子 该模板目前行数&#xff08;Markdown下包括文字&#xff09;&#xff1a;4799 行 更新日志&#xff08;从2018.11.19开始&#xff09; 2019.04.05 : 更新了数据结构->左偏树 2019.04.02 : 更新了数据结构->平衡树->WBLT 2019.03.26 : 更新了…...

哈尔滨网站建设费用/成都搜狗seo

文件透明加密这点事儿&#xff0c;从2001年开始出现基于API HOOK的方式开始到现在&#xff0c;已经十几年了&#xff0c;有细心人按技术实现的方式将其细分为4代&#xff0c;分别是基于API HOOK的第一代技术、基于文件过滤驱动&#xff08;加清缓存&#xff09;的第二代技术、使…...