【NODE】01-fs和path常用知识点

news2024/12/28 23:31:39

前言

最近在使用express-generator知识进行搭建前后端通信,其中有些知识点涉及到nodejs的fs和path核心模块,因此另写一篇文章进行介绍和代码案例练习。

fs(文件系统)和 path 是 Node.js 的核心模块,用于文件操作和路径处理。

一、fs讲解

1. fs.readFile 和 fs.writeFile

  • fs.readFile(path[, options], callback):异步读取文件内容。
  • fs.writeFile(path, data[, options], callback):异步写入文件。

 案例练习

先看目录

static文件夹用于存放内容(此时aa.txt和bb.txt均为空)

fs_demo.js用于代码撰写

//fs_demo.js
const fs = require('fs');

// 异步读取文件
fs.readFile('./static/aa.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 异步写入文件
fs.writeFile('./static/aa.txt', 'Hello World!', 'utf8', (err) => {
  if (err) throw err;
  console.log('写入已被保存!');
});

 打开文件的终端,执行终端

node fs_demo.js

 再打开aa.txt进行检查,此时发现"Hello World!"已被成功写入。


 2. fs.readFileSync 和 fs.writeFileSync

  • fs.readFileSync(path[, options]):同步读取文件内容。
  • fs.writeFileSync(path, data[, options]):同步写入文件。

 仍然是fs_demo.js(只是代码不同)这次操作的是bb.txt。

const fs = require('fs');

// 同步读取文件
try {
  const data = fs.readFileSync('./static/bb.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

// 同步写入文件
try {
  fs.writeFileSync('./static/bb.txt', 'Hello NODEJS!', 'utf8');
  console.log('内容已写入bb.txt!');
} catch (err) {
  console.error(err);
}

 执行文件

node fs_demo.js

 执行成功,并打开bb.txt进行检查。

 

3.关于同步和异步的理解

在 Node.js 中,fs 模块提供了同步和异步两种方法来处理文件系统操作。

选择使用同步还是异步方法取决于应用需求、性能考量和错误处理策略。

以下是一些指导原则:

异步方法

何时使用异步方法:

  1. 非阻塞操作:当您不希望文件操作阻塞事件循环时,应使用异步方法。这有助于保持应用程序的响应性,特别是在处理大量文件或大文件时。

  2. I/O 密集型应用:在 I/O 密集型应用中,如文件服务器或数据流处理,异步方法可以提高吞吐量和效率。

  3. 用户界面响应:在需要保持用户界面响应的应用(如命令行工具或图形界面应用)中,异步方法可以避免界面冻结。

  4. 并发操作:当您需要同时执行多个文件操作,并且希望它们并发运行时,异步方法更加合适。

  5. 错误处理:如果您希望在发生错误时立即处理,而不是等待整个操作完成,异步方法允许您在回调函数中立即捕获和处理错误。

同步方法

何时使用同步方法:

  1. 脚本和简单应用:在简单的脚本或小型应用中,同步方法可以简化代码,因为它们不需要回调函数。

  2. 初始化操作:在应用程序启动时进行的文件操作,如配置文件加载,可以使用同步方法,因为这些操作通常需要在程序继续之前完成。

  3. 顺序依赖操作:当一个操作的输出是下一个操作的输入,并且它们之间存在严格的顺序依赖时,同步方法可以确保操作按顺序执行。

  4. 测试和调试:在测试和调试阶段,同步方法可以提供更直观的控制流,使得问题更容易追踪和解决。

  5. 性能要求不高的场景:在文件操作对性能影响不大,或者文件很小的情况下,同步方法可以简化代码实现。

简单记忆和使用

在实际应用中,异步方法通常是首选,因为它们不会阻塞 Node.js 的事件循环,这对于保持高性能和良好的用户体验至关重要。

然而,在某些情况下,同步方法的简单性和直接性可能更适合特定的需求。


4. fs.appendFile 和 fs.appendFileSync

  • fs.appendFile(path, data[, options], callback):异步追加文件。
  • fs.appendFileSync(path, data[, options]):同步追加文件。

 异步追加文件

(在上述演示的异步读取、写入的案例中新增一个异步追加)

为了方便观察,这里我们把aa.txt内容清空。

注意文件路径

//fs_demo.js
const fs = require('fs');

// 异步读取文件
fs.readFile('./static/aa.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 异步写入文件
fs.writeFile('./static/aa.txt', 'Hello World!\n', 'utf8', (err) => {
  if (err) throw err;
  console.log('写入已被保存!');
});

// 异步追加文件
fs.appendFile('./static/aa.txt', '这是新追加的内容\n', (err) => {
    if (err) throw err;
    console.log('内容已追加到aa.txt中');
  });

执行文件:node fs_demo.js

 

同步追加文件

//fs_demo.js
const fs = require('fs');

// 同步读取文件
try {
  const data = fs.readFileSync('./static/bb.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

// 同步写入文件
try {
  fs.writeFileSync('./static/bb.txt', 'Hello NODEJS!', 'utf8');
  console.log('内容已写入bb.txt!');
} catch (err) {
  console.error(err);
}

  // 同步追加文件
try {
    fs.appendFileSync('./static/bb.txt', '\n新增内容Hello BB.TXT');
    console.log('内容已追加到bb.txt');
  } catch (err) {
    console.error(err);
  }

执行文件

 

5.关于写入和追加的注意点

文件写入(write

  • 行为:文件写入操作会覆盖文件指定位置之后的内容。如果文件不存在,写入操作会创建新文件。如果文件存在,写入操作会从指定的文件位置开始写入数据,覆盖原有数据。
  • 用途:当你需要完全替换文件内容或者从文件的特定位置开始写入新数据时,使用写入操作。
  • 影响:如果写入位置在文件中间,写入的数据会替换掉该位置之后的所有数据,导致原有数据丢失。

文件追加(append

  • 行为:文件追加操作会在文件的末尾添加数据,不会影响文件之前的内容。如果文件不存在,追加操作会创建新文件。
  • 用途:当你需要在文件末尾添加数据,而不需要修改或删除原有数据时,使用追加操作。
  • 影响:追加操作不会影响文件的现有内容,只会增加新数据到文件末尾。

书写位置的先后对文件的影响

书写位置的先后顺序对文件内容有直接影响,尤其是在不使用追加模式的情况下:

  1. 先写入后追加

    • 如果先写入文件,然后再追加文件,追加的数据会被添加到写入数据之后。如果写入操作覆盖了文件的末尾,追加的数据将跟在新写入的数据之后。
    • 例如,如果一个文件包含内容 "Hello",先写入 "World",然后追加 "!",最终文件内容将是 "World!"。
  2. 先追加后写入

    • 如果先追加文件,然后再写入文件,写入操作会覆盖追加的内容,如果写入位置在追加内容之前。
    • 例如,如果一个文件包含内容 "Hello",先追加 "!",然后写入 "World",最终文件内容将是 "World",追加的 "!" 将被覆盖。

6. fs.exists 和 fs.existsSync

  • fs.exists(path, callback):检查文件是否存在(已废弃)。
  • fs.existsSync(path):同步检查文件是否存在(推荐使用 fs.stat 或 fs.access)。

 代码案例(注意文件路径)

//fs_demo.js
const fs = require('fs');

// 同步检查文件是否存在
if (fs.existsSync('./static/aa.txt')) {
  console.log('File exists');
} else {
  console.log('File does not exist');
}

这里是检查utils/static文件夹下的aa.txt文件是否存在,因为我们在此之前已经创建aa.txt了,所以是存在的。


二、path讲解

1. path.join

  • path.join([...paths]):连接路径片段,自动处理路径分隔符。

2. path.resolve

  • path.resolve([...paths]):解析路径,返回绝对路径。

3. path.basenamepath.dirnamepath.extname

  • path.basename(path[, ext]):获取路径的基本名称(文件名)。
  • path.dirname(path):获取路径的目录名。
  • path.extname(path):获取路径的扩展名。

代码演示

代码写在utils/path_test.js

//path_test.js
const path = require('path');

const filePath = path.join(__dirname, '../utils/path_test.js');
console.log("path_test.js的__dirname>>>",__dirname);
console.log("path_test.js的__filename>>>",__filename);
console.log("当前文件path_test.js的绝对地址>>>",filePath);
console.log(__filename==filePath);


console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

const absolutePath = path.resolve(__dirname, './utils/static/aa.txt');
console.log("aa.txt的绝对路径>>>",absolutePath); 

console.log("<<<<<<<<<<<<<<<<<<<<");

const filePath3 = path.join(__dirname,'./utils/static/bb.txt');
console.log("bb.txt的文件名",path.basename(filePath3)); 
console.log("bb.txt所在目录",path.dirname(filePath3)); 
console.log("bb.txt的文件扩展",path.extname(filePath3)); 

 


总结 

至此,nodejs的核心模块fs和path已讲解完毕,并给出一些练习案例。大家也可以尝试将知识点综合使用到一起。比如:

用fs进行文件读取、写入、追加的时候,我们可以通过path模块,获取目标文件的路径,和fs结合使用。 


如果你喜欢这篇文章,可以点赞收藏。

关注我,了解更多前端实用知识。

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

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

相关文章

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

干货ScottPlot4向ScottPlot5迁移

干货ScottPlot4向ScottPlot5迁移 干货满满1.背景2.需求的引出3.先说结论1.好消息2.坏消息 4.迁移的部分笔记ColorScottPlot.PlottableScottPlot.Plottables中的对象如何定义添加 ScottPlot.Plottable.ScatterPlot 对象ScatterPolygonMarker也类似 Scatter的marker formsPlot1Re…

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐&#xff08;第九期&#xff09;一、【tldraw】&#xff0c;37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】&#xff0c;9.1k stars - 独立&#xff08;无需第三方服务器&#xff09;DPI 规避工具三、【uBlock】&#xff0c;48.3k s…

学习threejs,THREE.PlaneGeometry 二维平面几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️HREE.PlaneGeometry 二维平…

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路&#xff1a;(23min22s) 1.直接遍历遇0将行列设0肯定不行&#xff0c;会影响后续判断&#xff0c;题目又要求原地算法&#xff0c;那么进一步考虑是否可以将元素为0&#xff0c;其行列需要设为0的位置给存储下来&#xff0c;最后再遍历根据…

面向对象的设计原则与设计模式

目的 设计模式的目的是提高代码的重用性&#xff0c;可读性、可扩展性、可靠性&#xff0c;使程序呈现高内聚&#xff0c;低耦合的特性 原则 单一职责原则 假设有一个class负责两个职责&#xff0c;一旦发生需求变更&#xff0c;修改其中一个职责的逻辑代码&#xff0c;有可能…

网络安全词云图与技术浅谈

网络安全词云图与技术浅谈 一、网络安全词云图生成 为了直观地展示网络安全领域的关键术语&#xff0c;我们可以通过词云图&#xff08;Word Cloud&#xff09;的形式来呈现。词云图是一种数据可视化工具&#xff0c;它通过字体大小和颜色的差异来突出显示文本中出现频率较高…

Jsonlizer,一个把C++各类数据转成 Json 结构体的玩意儿

这段时间突发奇想&#xff0c;觉得可以弄一个Json和C各种数据类型互转的工具&#xff0c;因为Json在进行数据储存的时候&#xff0c;有一些先天的优势&#xff0c;传统的C的序列化方式是将数据序列化到流数据里面&#xff0c;而流数据是典型的串行结构&#xff08;或则说是一维…

删除拼排序链表中的重复元素(最优解)

题目来源 82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head…

OpenHarmony-5.PM 子系统(2)

电池服务组件OpenHarmony-4.1-Release 1.电池服务组件 Battery Manager 提供了电池信息查询的接口&#xff0c;同时开发者也可以通过公共事件监听电池状态和充放电状态的变化。电池服务组件提供如下功能&#xff1a; 电池信息查询。充放电状态查询。关机充电。 电池服务组件架…

深入浅出 Linux 操作系统

深入浅出 Linux 操作系统 引言 在当今数字化的时代&#xff0c;Linux 操作系统无处不在。从支撑互联网巨头庞大的数据中心&#xff0c;到嵌入智能家居设备的微型芯片&#xff0c;Linux 都发挥着关键作用。然而&#xff0c;对于许多人来说&#xff0c;Linux 仍笼罩着一层神秘的…

uniapp 文本转语音

uniapp 文本转语音 基于 Minimax API 的 UniApp 文本转语音工具&#xff0c;支持文本分段、队列播放、暂停恢复等功能。目前只内置了 Minimax文本转语音Minimax 的语音生成技术以其自然、情感丰富和实时性强而著称 API_KEY、GroupId 获取方法 https://platform.minimaxi.com…

前端图像处理(二)

目录 一、上传 1.1、文件夹上传以及进度追踪 1.2、拖拽上传 1.3、图片裁剪上传原理 二、图片布局 2.1、渐进式图片 2.2、图片九宫格 2.3、轮播图(Js) 2.3.1、3D动画轮播图 2.3.2、旋转切换的轮播图 2.4、卡片移入翻转效果 2.5、环绕式照片墙 一、上传 1.1、文件夹…

3.BMS系统原理图解读

一、BMS电池板 (1)电池的连接关系&#xff1a;串联 (2)采样控制点&#xff1a;CELL0 - CELL5 (3)端子P1和P3&#xff1a;BAT和BAT- (4)开关S1&#xff1a;控制充放电回路的机械开关 二、BMS控制板 (1)主控MCU 电源 复位 晶振 (2)LED指示灯&#xff1a;4电量指示 1调试指…

用于汽车碰撞仿真的 Ansys LS-DYNA

使用 Ansys LS-DYNA 进行汽车碰撞仿真汽车碰撞仿真 简介 汽车碰撞仿真是汽车设计和安全工程的一个关键方面。这些仿真使工程师能够预测车辆在碰撞过程中的行为&#xff0c;从而有助于改进安全功能、增强车辆结构并符合监管标准。Ansys LS-DYNA 是一款广泛用于此类仿真的强大工具…

使用Java和不同HTTP客户端库发送各种Content-Type类型请求

1. 引言 在HTTP协议中&#xff0c;Content-Type头用于指示请求或响应中数据的媒体类型。了解和正确设置Content-Type 对于确保客户端和服务器之间正确解析数据至关重要。本文将介绍如何使用Java 和 不同的HTTP客户端发送各种Content-Type 类型的请求。 2. 常见的Content-Type…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA&#xff08;自调制特征聚合模块&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。随着深度学习在计算机视觉中的不断进展&#xff0c;目标检测任务也在快速发展。YOLO系列模型&#xff08;You Onl…

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART&#xff08;串口通讯&#xff09;2.1 简介2.2 时序图分析2.3 UART的…

Docker 部署 plumelog 最新版本 实现日志采集

1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…

Empire Lupin One靶机

靶机 ip&#xff1a;192.168.152.157 我们访问页面 第一步信息收集 我们先扫描一下端口 扫描到开启了 22 端口 80 端口 我们使用御剑扫描一下网站的后台 我们挨个访问一下 发现 apache 的帮助页面&#xff0c;暂时记录&#xff0c;看看等会有没有需要 我们查看到 robots.tx…