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

前言

最近在使用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结合使用。 


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++编译过程初识

编译过程 预处理&#xff1a;主要是执行一些预处理指令&#xff0c;主要是#开头的代码&#xff0c;如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码&#xff0c;具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…

碰一碰发视频后端源码技术开发详解,支持OEM

一、引言 碰一碰发视频作为一种新颖的交互方式&#xff0c;在前端为用户带来便捷体验的同时&#xff0c;后端技术起着至关重要的支撑作用。后端负责管理视频资源、处理 NFC 标签信息与视频的关联逻辑、用户数据的存储与分析以及与前端的高效通信&#xff0c;确保整个系统稳定、…

HarmonyOS NEXT 实战之元服务:静态案例效果---本地特色景色

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

面试场景题系列:设计一致性哈希系统

为了实现横向扩展&#xff0c;在服务器之间高效和均匀地分配请求/数据是很重要的。一致性哈希是为了达成这个目标而被广泛使用的技术。首先&#xff0c;我们看一下什么是重新哈希问题。 1 重新哈希的问题 如果你有n个缓存服务器&#xff0c;常见的平衡负载的方法是使用如下哈希…

SqlSugar配置连接达梦数据库集群

安装达梦数据库时&#xff0c;会自动在当前操作系统中创建dm_svc.conf文件&#xff0c;可以在其中配置集群信息&#xff0c;不同操作系统下的文件位置如下图所示&#xff1a;   dm_svc.conf文件内的数据分为全局配置区域、服务配置区域&#xff0c;以参考文献1中的示例说明&…

scss配置全局变量报错[sass] Can‘t find stylesheet to import.

路径没有错误&#xff0c;使用别名即可 后又提示Deprecation Warning: Sass import rules are deprecated and will be removed in Dart Sass 3.0.0. 将import改为use 使用时在$前添加全局变量所在文件&#xff0c;即variable.

UGUI源码分析 --- UI的更新入口

首先所有的UI组件都是添加到画布&#xff08;Canvas&#xff09;显示的&#xff0c;所以首先要从Canvas入手&#xff0c;通过搜索脚本函数以及使用Profiler查看UI的函数的执行&#xff0c;定位到了willRenderCanvases函数 打开UI的文件夹&#xff0c; 通过搜索willRenderCanvas…

音视频入门知识(二)、图像篇

⭐二、图像篇 视频基本要素&#xff1a;宽、高、帧率、编码方式、码率、分辨率 ​ 其中码率的计算&#xff1a;码率(kbps)&#xff1d;文件大小(KB)&#xff0a;8&#xff0f;时间(秒)&#xff0c;即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV&#xff08;原始数据&am…

电脑配置maven-3.6.1版本

不要使用太高的版本。 apache-maven-3.6.1-bin.zip 下载这个的maven压缩包 使用3.6.1版本。 解压缩放在本地软甲目录下面&#xff1a; 配置系统环境变量 在系统环境下面配置MAVEN_HOME 点击path 新增一条 在cmd中输入 mvn -v 检查maven的版本 配置阿里云镜像和本地的仓库 …

Python基础语法知识——数据类型的查询、数据类型转化

今天第一次学习python&#xff0c;之前学习过C&#xff0c;感觉学习起来还可以&#xff0c;就是刚用的时候有点手残&#xff0c;想的是python代码&#xff0c;结果写出来就是C,本人决定每天抽出时间写点。同时继续更新NX二次开发专栏学习&#xff0c;话不多说&#xff0c;晚上的…

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…

C语言初阶习题【17】求N的阶乘( 递归和非递归实现)

1.题目 2.分析 非递归 需要用到循环&#xff0c;n个数就是循环n次&#xff0c;每次和之前的乘起来 例如 5的阶乘 就是 5*4 *3 *2 *1 循环1到5 。需要一个变量来接收每次的结果 注意这个地方是乘&#xff0c;所以要从1 开始&#xff0c;sum 也需要是1而不是0 for(i 1&#xf…

云效流水线自动化部署web静态网站

云效流水线部署静态网站 背景新建流水线配置流水线运行流水线总结 背景 配置流水线以前&#xff0c;每次更新导航网站都要登进去宝塔后台&#xff0c;删掉旧的目录和文件&#xff0c;再上传最新的文件&#xff0c;太麻烦啦 网上的博客基本都是分享vue项目&#xff0c;这一篇是…

【开源项目】数字孪生化工厂—开源工程及源码

飞渡科技数字孪生化工厂管理平台&#xff0c;基于自研孪生引擎&#xff0c;将物联网IOT、人工智能、大数据、云计算等技术应用于化工厂&#xff0c;为化工厂提供实时数据分析、工艺优化、设备运维等功能&#xff0c;助力提高生产效率以及提供安全保障。 通过可视化点位标注各厂…

SpringCloud整合skywalking实现链路追踪和日志采集

1.部署skywalking https://blog.csdn.net/qq_40942490/article/details/144701194 2.添加依赖 <!-- 日志采集 --><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version&g…

Linux下Nvidia显卡GPU开启驱动持久化

GPU开启驱动持久化的原因 GPU 驱动一直处于加载状态&#xff0c; 减少运行程序时驱动加载的延迟。不开启该模式时&#xff0c;在程序每次调用完 GPU 后&#xff0c; GPU 驱动都会被卸载&#xff0c;下次调用时再重新加载&#xff0c; 驱动频繁卸载加载&#xff0c; GPU 频繁被…

图像处理-Ch4-频率域处理

Ch4 频率域处理(Image Enhancement in Frequency Domain) FT &#xff1a;将信号表示成各种频率的正弦信号的线性组合。 频谱&#xff1a; ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…

虚拟化 | Proxmox VE 8.x 开源的虚拟化平台快速上手指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 简介说明 前言简述 描述:作为一个爱折腾的IT打工佬,时刻以学习各类新技术新知识为目标,这不正好有一台部署了VMware vSphere ESXi 虚拟化环境的服务器,由于正好安装其系统的磁盘有坏道,经常导致使用 ESXi 异…

rocketmq-push模式-消费侧重平衡-类流程图分析

1、观察consumer线程 使用arthas分析 MQClientFactoryScheduledThread 定时任务线程 定时任务线程&#xff0c;包含如下任务&#xff1a; 每2分钟更新nameServer列表 每30秒更新topic的路由信息 每30秒检查broker的存活&#xff0c;发送心跳请求 每5秒持久化消费队列的offset…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…