Node.js 文件系统操作指南
文章目录
- Node.js 文件系统操作完全指南
- 一、引言
- 二、基本文件操作
- 2.1 读取文件
- 2.2 写入文件
- 2.3 追加内容到文件
- 三、文件与目录的创建与删除
- 3.1 创建文件
- 3.2 创建目录
- 3.3 删除文件
- 3.4 删除目录
- 四、文件与目录的信息查询
- 4.1 检查文件或目录是否存在
- 4.2 获取文件信息
- 4.3 获取目录内容
- 五、流式文件操作
- 5.2 可写流
- 六、文件路径操作
- 6.1 路径规范化
- 6.2 路径拼接
- 七、文件系统的异步与同步操作
Node.js 文件系统操作完全指南
摘要:本文将深入探讨 Node.js 中的文件系统(fs)模块,它是 Node.js 中进行文件读写的核心模块。通过详细解释各种文件操作方法,本文将帮助您更好地理解和应用 Node.js 进行文件系统的操作。
一、引言
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用于方便地搭建响应速度快、易于扩展的网络应用。在 Node.js 中,几乎所有与文件的交互都是通过 fs(文件系统)模块来完成的。fs 模块提供了大量的 API,用于对系统文件及目录进行一系列的创建、读取、写入、删除、查询等操作。
二、基本文件操作
2.1 读取文件
Node.js 提供了多种读取文件的方法,其中最常用的是 fs.readFile。这个方法异步地读取文件的全部内容,并在读取完成后通过回调函数返回文件内容。
const fs = require('fs');fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log(data);
});
上述代码中,readFile 方法的第一个参数是文件路径,第二个参数是文件编码(默认为 null),第三个参数是读取完成后的回调函数。如果在读取文件过程中出现错误,err 对象将包含错误信息;否则,err 为 null,data 参数将包含文件的内容。
2.2 写入文件
写入文件可以使用 fs.writeFile 方法。这个方法异步地将数据写入文件,如果文件已存在,则替换该文件。如果文件不存在,则创建该文件。
const fs = require('fs');fs.writeFile('example.txt', 'Hello, World!', 'utf8', (err) => {if (err) throw err;console.log('The file has been saved!');
});
在上述代码中,writeFile 方法的第一个参数是文件路径,第二个参数是要写入的数据,第三个参数是文件编码(默认为 utf8),第四个参数是写入完成后的回调函数。
2.3 追加内容到文件
如果您想向现有文件追加内容,而不是覆盖它,可以使用 fs.appendFile 方法。
const fs = require('fs');fs.appendFile('example.txt', 'New content!', 'utf8', (err) => {if (err) throw err;console.log('The "New content!" was appended to file!');
});
三、文件与目录的创建与删除
3.1 创建文件
在 Node.js 中,您可以通过写入文件来创建文件。如果指定的文件不存在,fs.writeFile 和 fs.appendFile 方法都会创建新文件。
3.2 创建目录
要创建新目录,可以使用 fs.mkdir 方法。
const fs = require('fs');fs.mkdir('new_directory', { recursive: true }, (err) => {if (err) throw err;console.log('Directory created!');
});
在上述代码中,mkdir 方法的第一个参数是要创建的目录路径,第二个参数是一个选项对象,其中 recursive 属性设置为 true 允许在需要时创建中间目录,第三个参数是创建完成后的回调函数。
3.3 删除文件
要删除文件,可以使用 fs.unlink 方法。
const fs = require('fs');fs.unlink('example.txt', (err) => {if (err) throw err;console.log('File deleted!');
});
3.4 删除目录
要删除目录,可以使用 fs.rmdir 方法。需要注意的是,rmdir 只能删除空目录。
const fs = require('fs');fs.rmdir('empty_directory', (err) => {if (err) throw err;console.log('Directory deleted!');
});
如果您需要删除非空目录及其所有内容,可以使用 fs.rm 方法,并将 recursive 选项设置为 true。
const fs = require('fs');fs.rm('non_empty_directory', { recursive: true, force: true }, (err) => {if (err) throw err;console.log('Directory and its content deleted!');
});
四、文件与目录的信息查询
4.1 检查文件或目录是否存在
要检查文件或目录是否存在,可以使用 fs.exists 方法,但更推荐使用 fs.access,因为它提供了更好的错误处理。
const fs = require('fs');fs.access('example.txt', fs.constants.F_OK, (err) => {if (err) {console.log('File does not exist!');} else {console.log('File exists!');}
});
4.2 获取文件信息
要获取文件的信息(如文件大小、创建时间等),可以使用 fs.stat 或 fs.statSync 方法。
const fs = require('fs');fs.stat('example.txt', (err, stats) => {if (err) throw err;console.log(`File size: ${stats.size} bytes`);console.log(`Creation time: ${stats.ctime}`);
});
4.3 获取目录内容
要读取目录的内容,可以使用 fs.readdir 方法。
const fs = require('fs');fs.readdir('directory_path', (err, files) => {if (err) throw err;console.log(files);
});
五、流式文件操作
对于大文件或需要逐步处理的文件,使用流式操作更加高效。Node.js 提供了四种流:可读流(Readable)、可写流(Writable)、双向流(Duplex)和转换流(Transform)。
5.1 可读流
可读流用于从数据源(如文件)读取数据。
const fs = require('fs');const readableStream = fs.createReadStream('large_file.txt');readableStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);
});readableStream.on('end', () => {console.log('No more data.');
});readableStream.on('error', (err) => {console.error(`Error occurred: ${err}`);
});
5.2 可写流
可写流用于将数据写入目标(如文件)。
const fs = require('fs');const writableStream = fs.createWriteStream('output.txt');writableStream.write('Hello, ');
writableStream.write('World!');writableStream.end();writableStream.on('finish', () => {console.log('All data has been flushed to the file system.');
});writableStream.on('error', (err) => {console.error(`Error occurred: ${err}`);
});
六、文件路径操作
Node.js 的 path 模块提供了许多实用方法来处理文件和目录的路径。
6.1 路径规范化
使用 path.normalize 方法可以将路径字符串转换为规范化路径。
const path = require('path');console.log(path.normalize('/foo/bar//baz/asdf/../../'));
// 输出: '/foo/bar/baz'
6.2 路径拼接
使用 path.join 方法可以将多个路径片段拼接成一个路径字符串。
const path = require('path');console.log(path.join(__dirname, 'foo', 'bar', 'baz', 'qux.txt'));
// 输出类似于: '/Users/example/foo/bar/baz/qux.txt'
七、文件系统的异步与同步操作
Node.js 的 fs 模块提供了大多数文件操作的异步和同步版本。异步方法通常在方法名的末尾包含 “Sync”,如 fs.readFileSync 和 fs.writeFileSync。
异步方法不会阻塞 Node.js 事件循环,这使得应用程序可以同时处理多个操作。而同步方法会阻塞事件循环,直到操作完成。
通常,推荐使用异步方法,因为它们提供了更好的性能和更高的吞吐量。然而,在某些情况下,如初始化脚本或命令行工具,使用同步方法可能更方便。
相关文章:
Node.js 文件系统操作指南
文章目录 Node.js 文件系统操作完全指南一、引言二、基本文件操作2.1 读取文件2.2 写入文件2.3 追加内容到文件 三、文件与目录的创建与删除3.1 创建文件3.2 创建目录3.3 删除文件3.4 删除目录 四、文件与目录的信息查询4.1 检查文件或目录是否存在4.2 获取文件信息4.3 获取目录…...
Kotlin 协程1:深入理解withContext
Kotlin 协程1:深入理解withContext 引言 在现代编程中,异步编程已经变得非常重要。在 Kotlin 中,协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中,我们将深入探讨 Kotlin 协程中的一个重要函数:wi…...
(自用)learnOpenGL学习总结-高级OpenGL-几何着色器
在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…...
坚持刷题 | 完全二叉树的节点个数
Hello,大家好,我是阿月!坚持刷题,老年痴呆追不上我,今天刷:完全二叉树的节点个数 题目 222.完全二叉树的节点个数 代码实现 class TreeNode {int val;TreeNode left, right;public TreeNode(int val) …...
K8S网络
一、介绍 k8s不提供网络通信,提供了CNI接口(Container Network Interface,容器网络接口),由CNI插件实现完成。 1.1 Pod通信 1.1.1 同一节点Pod通信 Pod通过虚拟Ethernet接口对(Veth Pair)与外部通信,Veth…...
【蓝桥杯51单片机入门记录】LED
目录 一、基础 (1)新建工程 (2)编写前准备 二、LED (1)点亮LED灯 (2)LED闪烁 延时函数的生成(stc-isp中生成) 实现 (3)流水灯…...
轻松使用python将PDF转换为图片(成功)
使用PyMuPDF(fitz)将PDF转换为图片 在处理PDF文件时,我们经常需要将PDF页面转换为图片格式,以便于在网页、文档或应用程序中显示。Python提供了多种方式来实现这一需求,本文将介绍如何使用PyMuPDF(也称为f…...
【目标检测】对DETR的简单理解
【目标检测】对DETR的简单理解 文章目录 【目标检测】对DETR的简单理解1. Abs2. Intro3. Method3.1 模型结构3.2 Loss 4. Exp5. Discussion5.1 二分匹配5.2 注意力机制5.3 方法存在的问题 6. Conclusion参考 1. Abs 两句话概括: 第一个真正意义上的端到端检测器最…...
[工具探索]Safari 和 Google Chrome 浏览器内核差异
最近有些Vue3的项目,使用了safari进行测试环境搞开发,发现页面存在不同程序的页面乱码情况,反而google浏览器没问题,下面我们就对比下他们之间的差异点: 日常开发google chrome占多数;现在主流浏览器 Goog…...
文本生成高清、连贯视频,谷歌推出时空扩散模型
谷歌研究人员推出了创新性文本生成视频模型——Lumiere。 与传统模型不同的是,Lumiere采用了一种时空扩散(Space-time)U-Net架构,可以在单次推理中生成整个视频的所有时间段,能明显增强生成视频的动作连贯性ÿ…...
时隔3年 | 微软 | Windows Server 2025 重磅发布
最新功能 以下是微软产品团队正在努力的方向: Windows Server 2025 为所有人提供的热补丁下一代 AD 活动目录和 SMB数据与存储Hyper-V 和人工智能还有更多… Ignite 发布视频 Windows Server 2025 Ignite Video 介绍 Windows Server 2022 正式发布日期是2021年…...
有趣的css - 动态的毛玻璃背景
页面效果 此效果主要使用 backdrop-filter 属性,以及配合 animation 属性来实现毛玻璃模糊和一些动效。 此效果可适用于登录窗口,网站背景或者一些卡片列表中,使网页更具科技感和空间感。 核心代码部分,简要说明了写法思路&#x…...
桥接模式解析
回调设计模式 意图 回调是指一段可以执行的代码,该代码会被作为参数传递给其他代码,在适当的时候,预期这部分代码将会被调用执行。 解释 案例:我们需要在执行完任务后得到通知。为此,我们会向执行器传递一个回调方法…...
MySQL数据库基础第一篇(SQL通用语法与分类)
文章目录 一、SQL通用语法二、SQL分类三、DDL语句四、DML语句1.案例代码2.读出结果 五、DQL语句1.DQL-基本查询2.DQL-条件查询3.DQL-聚合函数4.DQL-分组查询5.DQL-排序查询6.DQL-分页查询7.DQL语句-执行顺序1.案例代码2.读出结果 六、DCL语句1.DCL-管理用户2.DCL-权限控制1.案例…...
【Qt学习笔记】(一)初识Qt
Qt学习笔记 1 使用Qt Creator 新建项目2 项目代码解释3 创建第一个 Hello World 程序4 关于内存泄漏问题5 Qt 中的对象树6 关于 qDebug()的使用7 使用其他方式创建一个 Hello World 程序(编辑框和按钮方式)8 关于 Qt 中的命名规范…...
YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?
前两天YIA主题发布了升级到2.8版本,新增了一些功能,优化调整修复了一些功能,但是这些功能调整幅度不大,加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改,所以就懒得升级了,但是每次进入WordPr…...
消息队列的应用场景
消息队列的应用场景 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性架构使用较多的消息队列有ActiveMQ,RabbitMQ,Ze…...
Arcgis10.3安装
所需软件地址 链接:https://pan.baidu.com/s/1aAykUDjkaXjdwFjDvAR83Q?pwdbs2i 提取码:bs2i 1、安装License Manager 点击License Manager.exe,默认下一步。 安装完,点击License Server Administrator,停止服务。…...
用Python和 Cryptography库给你的文件加密解密
用Python和 Cryptography库给你的文件加密解密 用Python和 Cryptography库给你的文件加把安全锁。 先介绍与加密解密有关的几个基本概念。 加密(Encryption):加密是将明文转换为密文的过程,使得未经授权的人无法读懂。 解密&a…...
element-ui button 仿写 demo
基于上篇 button 源码分享写了一个简单 demo,在写 demo 的过程中,又发现了一个小细节,分享一下: 1、组件部分: <template><buttonclass"yss-button"click"handleClick":class"[ty…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...
