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

node.js基础学习-fs模块-文件操作(六)

一、前言

fs模块是 Node.js 内置的文件系统(File System)模块,它提供了一系列用于与文件系统进行交互的方法。通过fs模块,可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作,这使得 Node.js 能够很好地处理本地文件相关的任务。

二、常用方法

1. 读取文件

fs.readFile():这是一种异步读取文件内容的方法。它接受文件路径、编码方式(可选)和回调函数作为参数。例如:

const fs = require('fs');
const file_path = 'example.txt';
fs.readFile(file_path, 'utf8', (err, data) => {if (err) {console.error('读取文件出错:', err);} else {console.log('文件内容:', data);}
});

在这个例子中,fs.readFile()尝试以utf8编码读取example.txt文件。如果读取过程中出现错误,err参数会包含错误信息,在回调函数中可以进行错误处理;如果读取成功,文件内容会存储在data参数中并打印出来。

fs.readFileSync():这是fs.readFile()的同步版本。它会阻塞 Node.js 进程,直到文件读取完成。例如:

const fs = require('fs');
const file_path = 'example.txt';
try {const data = fs.readFileSync(file_path, 'utf8');console.log('文件内容:', data);
} catch (err) {console.error('读取文件出错:', err);
}

这里使用try - catch块来捕获可能出现的错误。由于是同步操作,代码的执行顺序比较直观,在读取大文件时可能会导致程序暂时无响应,因为它会等待文件读取完成。

2. 写入文件

fs.writeFile():用于异步地将数据写入文件。如果文件不存在,会创建一个新文件;如果文件已存在,则会覆盖原有内容。例如:

const fs = require('fs');
const file_path = 'new_example.txt';
const data = '这是要写入文件的内容';
fs.writeFile(file_path, data, 'utf8', (err) => {if (err) {console.error('写入文件出错:', err);} else {console.log('文件已成功写入');}
});

这个例子中,将字符串datautf8编码写入到new_example.txt文件中。同样,通过回调函数处理写入过程中的错误或成功情况。(内容会被覆盖)

fs.writeFileSync():这是fs.writeFile()的同步版本,会阻塞进程直到写入操作完成。例如:

const fs = require('fs');
const file_path = 'new_example.txt';
const data = '这是要写入文件的内容';
try {fs.writeFileSync(file_path, data, 'utf8');console.log('文件已成功写入');
} catch (err) {console.error('写入文件出错:', err);
}

3. 追加文件内容

fs.appendFile():异步地将数据追加到文件末尾(这个解决了**fs.writeFile()**会覆盖前面内容的特点)。例如:

const fs = require('fs');
const file_path = 'append_example.txt';
const data = '这是要追加的内容';
fs.appendFile(file_path, data, 'utf8', (err) => {if (err) {console.error('追加文件内容出错:', err);} else {console.log('内容已成功追加到文件');}
});
  • fs.writeFile()不同的是,fs.appendFile()不会覆盖原有文件内容,而是在文件末尾添加新内容。
  • **fs.appendFileSync()**:这是fs.appendFile()的同步版本,会阻塞进程进行追加操作。

4. 读取目录内容

fs.readdir():异步地读取目录中的文件和子目录列表。例如:

const fs = require('fs');
const dir_path = 'example_directory';
fs.readdir(dir_path, (err, files) => {if (err) {console.error('读取目录出错:', err);} else {console.log('目录中的文件和子目录:', files);}
});
  • 这个方法返回目录中的文件名和子目录名的数组。如果需要进一步了解每个文件或子目录的详细信息,可以结合其他方法,如fs.stat()来获取文件或目录的状态信息。
  • fs.readdirSync():这是fs.readdir()的同步版本,会返回目录中的文件和子目录名的数组。

5. 检查文件或目录是否存在

fs.existsSync():这是一个同步方法,用于检查指定的文件或目录是否存在。例如:

const fs = require('fs');
const file_path = 'example.txt';
if (fs.existsSync(file_path)) {console.log('文件存在');
} else {console.log('文件不存在');
}

需要注意的是,在 Node.js 官方文档中,fs.exists()(异步版本)已被废弃,推荐使用fs.existsSync()(同步版本)或者其他替代方法,如fs.stat()fs.access()来检查文件或目录的存在性。

6. 获取文件或目录的状态信息

fs.stat():异步地获取文件或目录的状态信息,包括文件大小、创建时间、修改时间、权限等。例如:

const fs = require('fs');const fileOrDirectoryPath = 'example.txt';fs.stat(fileOrDirectoryPath, (err, stats) => {if (err) {console.error('获取文件或目录状态出错:', err);} else {// 检查是文件还是目录if (stats.isFile()) {console.log('这是一个文件。');console.log('文件大小为:', stats.size, '字节');console.log('文件的创建时间为:', stats.birthtime);console.log('文件的最后访问时间为:', stats.atime);console.log('文件的最后修改时间为:', stats.mtime);} else if (stats.isDirectory()) {console.log('这是一个目录。');console.log('目录中的文件数量(大致):', stats.nlink);}}
});

这里的stats对象包含了许多关于文件或目录状态的属性,可以根据需要获取相应的信息。fs.statSync()是其同步版本。

7. 文件流(Stream)相关操作(高级用法)

fs.createReadStream()fs.createWriteStream():这两个方法用于创建文件读取流和文件写入流,通过流的方式处理文件可以更高效地处理大型文件,避免一次性将整个文件内容加载到内存中。例如,复制一个文件:

const fs = require('fs');
const read_stream = fs.createReadStream('source_file.txt');
const write_stream = fs.createWriteStream('destination_file.txt');
read_stream.on('data', (chunk) => {write_stream.write(chunk);
});
read_stream.on('end', () => {write_stream.end();console.log('文件复制完成');
});

在这个例子中,fs.createReadStream('source_file.txt')创建了一个读取source_file.txt文件的读取流,fs.createWriteStream('destination_file.txt')创建了一个写入destination_file.txt的写入流。当读取流有数据(read_stream.on('data',...))时,将数据块chunk写入到写入流中。当读取流结束(read_stream.on('end',...))时,结束写入流操作,表示文件复制完成。这种方式在处理大型文件时,能够有效地利用内存,提高文件处理的效率。

前面我们写的那个简单的爬虫例子也是用到了fs.createWriteStream(),将爬虫爬到的图片下载到相应的目录下。

相关文章:

node.js基础学习-fs模块-文件操作(六)

一、前言 fs模块是 Node.js 内置的文件系统(File System)模块,它提供了一系列用于与文件系统进行交互的方法。通过fs模块,可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作,这使得 Node.js 能够很好地处…...

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例) 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象…...

Oracle SCN与时间戳的映射关系

目录 一、基本概述 二、相关操作 三、参考文档 一、基本概述 Oracle 数据库中的 SYS.SMON_SCN_TIME 表是一个关键的内部表,主要用于记录过去时间段中SCN与具体的时间戳之间的映射关系。这种映射关系可以帮助用户将 SCN 值转换为可读性更强的时间戳,从而…...

【广告投放系统】头条可视化投放平台vue3+element-plus+vite落地历程和心得体会

前言 hallo,又是许久未见,昨天也是正式把公司内部的广告投放平台暂时落地,我也即将离开待了两年多的地方。言归正传,由于头条广告后台的升级改版,因此为了满足内部投放需求,做了一个可视化的投放平台&…...

Gazebo插件相机传感器(可订阅/camera/image_raw话题)

在仿真环境中使用相机传感器,通常需要结合Gazebo插件来实现。Gazebo是一个功能强大的机器人仿真工具,支持多种传感器模型,包括相机。下面是如何在Gazebo中使用相机传感器的详细步骤。 1. 修改Xacro文件以包含Gazebo插件 首先,修…...

华三(HCL)和华为(eNSP)模拟器共存安装手册

接上章叙述,解决同一台PC上同时部署华三(HCL)和华为(eNSP)模拟器。原因就是华三HCL 的老版本如v2及以下使用VirtualBox v5版本,可以直接和eNSP兼容Oracle VirtualBox,而其他版本均使用Oracle VirtualBox v6以上的版本,…...

信息学奥赛一本通 1448:【例题1】电路维修 | 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修

【题目链接】 ybt 1448:【例题1】电路维修 洛谷 P4667 [BalticOI 2011 Day1] Switch the Lamp On 电路维修 【题目考点】 1. 双端队列广搜(0-1BFS) 【解题思路】 整个电路是由一个个的正方形的电路元件组成,每个正方形有四个…...

k8s删除网络组件错误

k8s集群删除calico网络组件重新部署flannel网络组件,再部署pod后出现报错不能分配ip地址 plugin type"calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized 出现该问题是因为删除网络组件后,网…...

MySQL之JDBC

我们在学习完了数据库的基本操作后,希望和我们的Java程序建立连接,那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的 1. 什么是JDBC JDBC(Java Data Base Connectivity, Java数据库连接) 是Java程序和数据库之间…...

音视频入门基础:MPEG2-TS专题(10)——PAT简介

一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时,该transport packet的payload为Program association table ,即 PAT表。PAT表包含所有PMT表的目录列表,将program_number和PMT表的PID相关联,获取数据的起始…...

ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏

我们在开发ElementUI的时候遇到抽屉组件全屏的问题,但是我们需要在指定div中展示出来,上代码: 1、在el-drawer中增加属性 el-drawerstyle"position: absolute"z-index"-1":append-to-body"false">// do s…...

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前,需要搭建Node环境以及Vue-CLI脚手架,由于本篇文章为上一篇文章的补充,也是为了给大家分享更为完整的搭建vue项目方式,所以环境准备部分采用Vue教程|搭建vue项目|V…...

jmeter学习(7)命令行控制

jmeter -n -t E:\IOT\test2.jmx -l E:\IOT\output\output.jtl -j E:\IOT\output\jmeter.log -e -o E:\IOT\output\report IOT下创建output 文件夹,jmx文件名避免中文,再次执行output.jtl不能有数据要删除...

BGP协议路由黑洞

一、实验环境 1、分公司与运营商AS自治系统内运行IGP路由协议OSPF、RIP或静态路由,AS自治系统内通过IBGP路由协议建立BGP邻居关系。 2、公司AS自治系统与运营商AS自治系统间运行EBGP路由协议。 3、通过loopback建立IBGP与EBGP邻居关系,发挥loopback建立…...

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…...

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马,请找到木马的密码提交 2.服务器疑似存在不死马,请找到不死马的密码提交 3.不死马是通过哪个文件生成的,请提交文件名 4.黑客留下了木马文件,请找出黑客的服务器ip提交 5.黑客留…...

python爬虫安装教程

Python爬虫是用于从网站上自动抓取信息的程序。在开始之前,请确保您了解并遵守目标网站的服务条款,尊重版权法,并且在合理合法的范围内使用爬虫技术。 安装环境 安装Python:首先确保您的计算机上已经安装了Python。推荐版本为3.…...

田忌赛马五局三胜问题matlab代码

问题描述:在可以随机选择出场顺序的情况下,如果把比赛规则从三局两胜制改为五局三胜制,齐王胜出的概率是上升了还是下降了?五局三胜的赛制下,大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...

Spring循环依赖问题的解决

项目启动提示如下异常: The dependencies of some of the beans in the application context form a cycle 这表明在我们的应用中存在了循环依赖,示例: Bean A 中注入了Bean B依赖,然后 Bean B 中注入了Bean A依赖。也就是说&…...

KAN-Transfomer——基于新型神经网络KAN的时间序列预测

1.数据集介绍 ETT(电变压器温度):由两个小时级数据集(ETTh)和两个 15 分钟级数据集(ETTm)组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) :描…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...