Node.js——fs(文件系统)模块

news2025/1/9 18:16:28

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 前言
    • writeFile 文件写入
    • appendFile 追加写入
    • writeFile 追加写入
    • createWriteStream 流式写入
    • readFile 文件读取
    • createReadStream 流式读取
    • 文件复制(同步)
    • 文件复制(流式)
    • rename 文件重命名
    • unlink / rm 文件删除
    • 文件夹操作
      • mkdir 创建文件夹
      • 递归创建文件夹
      • readdir 读取文件夹
      • rmdir 删除文件夹
      • 递归删除文件夹
    • stat 查看资源信息
    • __dirname & __filename
    • 总结

前言

Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本。

我认为,作为一名前端开发人员,学习 Node.js 是非常有必要的!它可以充当服务端,补足前端程序员对服务端语言的欠缺。

本篇文章我们学习 Node.js 的 fs 模块(即文件系统模块)。


writeFile 文件写入

写入文件前要先导入 fs 模块,之后通过 writeFile 可以进行异步写入,通过 writeFileSync 可以进行同步写入。

writeFile 接口接收三个参数(从左到右依次为):

  • 要写入的文件名
  • 待写入的数据
  • 回调函数,处理 error 场景
const fs = require('fs');

// 异步写入
// 文件名,待写入的数据,回调
fs.writeFile('./demo.txt', '积跬步至千里', (err) => {
    if (err) {
        console.log('写入文件失败');
        return;
    }
    console.log('写入文件成功');
})

// 同步写入
// fs.writeFileSync('./demo2.txt', '积小流成江海');

终端执行 node xxx.js 即可看到打印的信息,若成功写入则将得到包含 积跬步至千里demo.txt 文本。

在这里插入图片描述

在这里插入图片描述


appendFile 追加写入

异步追加写入使用 appendFile 接口,同步追加写入使用 appendFileSync 接口。

  • \r\n 表示回车后换行
const fs = require('fs');

// 异步追加写入
fs.appendFile('./demo.txt', '\r\n积小流成江海', (err) => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

// 同步追加写入
// fs.appendFileSync('./demo.txt', '\r\n积小流成江海');

在这里插入图片描述

在这里插入图片描述


writeFile 追加写入

使用 writeFile 也可以实现追加写入,但要添加一个 flag 标识(如下代码的 { flag: 'a' })。

const fs = require('fs');

// writeFile 实现追加写入,添加 flag
fs.writeFile('./demo.txt', '\r\n使用writeFile追加写入', { flag: 'a' }, err => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

在这里插入图片描述

在这里插入图片描述


createWriteStream 流式写入

使用 createWriteStream 创建写入流对象,调用 write 方法进行流式写入。

const fs = require('fs');

// 流式写入:适合大文件写入或频繁写入
// 创建写入流对象
const writeStream = fs.createWriteStream('./流式写入.txt');

writeStream.write("hello, ");
writeStream.write("node!\n");

// 适用于需要结束数据传输的场景,例如写入文件或发送数据到客户端后关闭连接。
writeStream.end();

// 适用于需要立即关闭流而不结束数据传输的场景,例如服务器关闭连接前执行一些清理工作。
// writeStream.close();

// 流式写入完成时触发
writeStream.on('finish', () => {
    console.log("All writes are now complete.");
})

在这里插入图片描述

在这里插入图片描述


readFile 文件读取

使用 readFile 进行异步文件读取,使用 readFileSync 进行同步文件读取。

const fs = require('fs');

// 异步文件读取
fs.readFile('./demo.txt', (err, data) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log(data.toString());
})

// 同步文件读取
// const data = fs.readFileSync('./demo.txt')
// console.log(data.toString());

在这里插入图片描述


createReadStream 流式读取

使用 createReadStrem 创建读取流对象。添加监听事件监听数据及读取完成。

const fs = require('fs');

// 流式读取
// 创建读取流对象
const rs = fs.createReadStream('./demo.txt');

rs.on('data', chunk => {
    console.log(chunk.length);
})

rs.on('end', () => {
    console.log('读取完毕!');
})

在这里插入图片描述


文件复制(同步)

同步文件复制即先使用 readFileSync 读取文件,再把读取到的文件作为内容写入新文件。

const fs = require('fs');
const process = require('process');

// 同步复制
const data = fs.readFileSync('./demo.txt');
fs.writeFileSync('./demo2.txt', data);
// 读取一个描述 Node.js 进程的内存使用量对象,所有属性值都以字节为单位。
console.log(process.memoryUsage());

在这里插入图片描述

在这里插入图片描述


文件复制(流式)

流式文件复制即先创建 流式读取对象流式写入对象,然后再基于流式读取的内容进行流式写入至新文件。

const fs = require('fs');
const process = require('process');

// 流式复制
const readStream = fs.createReadStream('./demo.txt');
const writeStream = fs.createWriteStream('./demo3.txt');

// 效果等同于 readStream.pipe(writeStream);
// readStream.on('data', chunk => {
//     writeStream.write(chunk)
// })

readStream.on('end', () => {
    console.log(process.memoryUsage());
})

readStream.pipe(writeStream);

在这里插入图片描述

在这里插入图片描述


rename 文件重命名

使用 rename 方法进行异步重命名文件;使用 renameSync 进行同步重命名文件。

const fs = require('fs');

fs.rename('./demo.txt', './renameDemo.txt', err => {
    if (err) {
        console.log('err');
        return;
    }
    console.log('success');
})

// fs.renameSync('./renameDemo.txt', './demo.txt');

在这里插入图片描述

在这里插入图片描述


unlink / rm 文件删除

使用 unlinkrm 进行文件的异步删除,使用 unlinkSyncrmSync 进行文件的同步删除。

const fs = require('fs')

// 通过 unlink 删除,同步 unlinkSync
fs.unlink('demo.txt', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

// 通过 rm 删除,同步 rmSync
// fs.rm('demo2.txt', err => {
//     if (err) {
//         console.log('err')
//         return
//     }
//     console.log('success')
// })

在这里插入图片描述


文件夹操作

mkdir 创建文件夹

使用 mkdir 进行文件夹的创建。

const fs = require('fs')

// 创建 createDir 文件夹
fs.mkdir('./createDir', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

在这里插入图片描述

在这里插入图片描述


递归创建文件夹

使用 mkdir 可以进行递归创建文件夹(recursive - 是否以递归的方式创建目录,默认为 false)。

const fs = require('fs')

// 递归创建
fs.mkdir('./a/b/c', {recursive: true}, err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

在这里插入图片描述
在这里插入图片描述


readdir 读取文件夹

使用 readdir 进行文件的读取操作。

const fs = require('fs')

// 读取文件夹
fs.readdir('../../node-learn', (err, data) => {
    if (err) {
        console.log('err', err)
        return
    }
    console.log('data', data)
})

在这里插入图片描述


rmdir 删除文件夹

使用 rmdir 进行对文件夹的删除。

const fs = require('fs')

// 删除文件夹
fs.rmdir('./createDir', err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

在这里插入图片描述


递归删除文件夹

使用 rm 进行递归删除文件夹(recursive: true 以递归的方式删除目录,默认为 false)。

const fs = require('fs')

// 递归删除
fs.rm('./a', {recursive: true}, err => {
    if (err) {
        console.log('err')
        return
    }
    console.log('success')
})

在这里插入图片描述


stat 查看资源信息

提前准备好 demo.txt 文件,内容如下:

在这里插入图片描述

使用 stat 查看资源信息。

const fs = require('fs')

fs.stat('./demo.txt', (err, data) => {
    if (err) {
        console.log('err')
        return
    }
    console.log(data)
    // 判断是否是文件
    console.log('判断是否是文件', data.isFile())
    // 判断是否是文件夹
    console.log('判断是否是文件夹', data.isDirectory())
})

在这里插入图片描述


__dirname & __filename

__dirname 表示当前文件所在目录的绝对路径。

__filename 表示当前文件所在目录的完整路径(包括文件名)。

const fs = require('fs')

// 写入文件
fs.writeFileSync(__dirname + '/demo.txt', '绝对路径')

// 所在文件的所在目录的绝对路径
console.log('__dirname', __dirname)
// 当前文件的完整路径(包含文件名)
console.log('__filename', __filename)

在这里插入图片描述


总结

本篇文章我们学习了如何使用 Node.js 进行文件操作。包括文件的写入、追加写入、流式写入、文件复制、文件重命名、文件删除、文件夹操作、查看资源信息和获取绝对路径等。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Node.js教程(菜鸟教程)
  2. Node.js零基础视频教程(尚硅谷 · 李强)

在这里插入图片描述


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

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

相关文章

【cuda学习日记】2.1 2D matrix操作

2.1.1 检查块和线程索引 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <cuda_runtime.h>#define CHECK(call) \{\const cudaError_t error call; \if (error ! cudaSuccess)\{\printf("Error…

Nginx:会话保持

会话保持 是指在负载均衡环境中,确保来自同一用户的多个请求都发送到同一个后端服务器。这通常用于那些需要记住用户状态或上下文的应用程序,例如购物车、登录状态等。 会话保持的重要性 用户体验:保证用户在整个会话期间的一致性体验,避免因不同服务器间的数据不同步导致…

Java-数据结构-链表-高频面试题(1)

在上一篇文章中&#xff0c;我们学习了链表中的"单向链表"&#xff0c;但学可不代表就是学会了&#xff0c;能够运用链表的地方比比皆是&#xff0c;解题方法也是层出不穷&#xff0c;今天就让我们巩固一下"单向链表"的知识吧~ 第一题&#xff1a;相交链表…

5. 多线程(3) --- synchronized

文章目录 前言1. 如何解决线程安全问题 [回顾]2. synchronized 关键字2.1. 示例2.2.对示例进行变化2.3 synchronized的其他写法2.4 synchronized的特性2.4.1 互斥2.4.2. 刷新内存2.4.3. 可重入 前言 前面我们通过在两个线程中共同对count进行加一操作&#xff0c;最后得到的结…

阿尔法linux开发板ping不通百度

我使用的阿尔法linux板子&#xff0c;发现按照《03【正点原子】I.MX6U网络环境TFTP&NFS搭建手册V1.3.2》一套操作下来&#xff0c;还是没办法实现板子上网。 我总结了下面方法&#xff0c;我如何实现联网和互ping通&#xff0c;大致总结下三步 一、pc端的wifi网络&#xf…

Qt之屏幕录制设计(十六)

Qt开发 系列文章 - screencap&#xff08;十六&#xff09; 目录 前言 一、实现原理 二、实现方式 1.创建录屏窗口 2.录屏窗口类定义 3.自建容器对象定义 4.用户使用 5.效果演示 总结 前言 利用Qt实现屏幕录制设计&#xff0c;可以通过使用Qt自带的类QScreen、QPixma…

AI通过数据构建一个独有对话机器人

AI通过数据构建一个独有对话机器人&#xff0c;尝试构建快速构建专有知识的机器人。 前端使用tinker实现一个简单的对话窗口&#xff0c; 后端使用自己的数据进行不断的训练&#xff0c;有需要的可以依据自己的实际情况进行修改&#xff0c;和优化 import tkinter as tk fro…

xml格式化(1):使用python的xml库实现自闭合标签

前言 最近一段时间一直想要写一个urdf格式化插件。 至于为什么嘛&#xff0c;因为使用sw2urdf插件&#xff0c;导出的urdf&#xff0c;同一标签的内容&#xff0c;是跨行的&#xff0c;这就导致&#xff0c;内容比较乱&#xff0c;而且行数比较多。影响阅读。 因此&#xff…

【免费】2004-2019年各省规模以上工业企业RD经费面板数据

2004-2019年各省规模以上工业企业R&D经费面板数据 1、时间&#xff1a;2004-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、规模以上工业企业R&D经费(万元) 4、范围&#xff1a;31省 5、规模以上工企&#xff0c…

电路学习(一)之电阻

电阻在电路中具有限制电流、分流、分压等功能&#xff0c;是电路中必不可少的组成部分。 1.什么是电阻&#xff1f; 电阻是一种符合欧姆定律&#xff08;R&#xff09;、限制电流流动的线性元件。简单来说&#xff0c;电阻就是可以限制电流流过的电子器件&#xff0c;其主要功…

Facebook元宇宙项目中的智能合约应用:提升虚拟空间的自治能力

近年来&#xff0c;Facebook在元宇宙领域的探索引起了广泛关注。元宇宙是一个融合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和互联网的沉浸式数字空间。在这个过程中&#xff0c;智能合约技术被认为是提升虚拟空间自治能力的关键工具。通过自动…

SSR 【1】【nuxt安装】

文章目录 前言如何解决 前言 nuxt提供了nuxi脚手架工具&#xff0c;让开发者便捷生成nuxt模板项目。nuxt官网 npx nuxilatest init <project-name>但是几乎大部分的人在安的时候都会遇到这个问题 如何解决 在C:\Windows\System32\drivers\etc\hosts中增加如下解析记录…

mv指令详解

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. …

【APP】5分钟上手基于BurpSuite的APP抓包

step 1 手机和电脑连上同一个wifi step 2 ipconfig -all查看电脑在WLAN下的IP 这里为10.0.23.80 step3 bp设置监听的端口和ip&#xff0c;ip设置为上一步看到的ip step4 bp导出证书 der后缀改为cer 传给手机 step5 在设置中搜索证书&#xff0c;按步骤安装证书 step6 在…

【工业场景】用YOLOv8实现工业安全帽识别

工业安全帽识别是一项重要的工作安全管理措施&#xff0c;旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型&#xff0c;可以实时准确地检测出工人是否佩戴安全帽&#xff0c;及时发现违规行为&#xff0c;为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…

51单片机——共阴数码管实验

数码管中有8位数字&#xff0c;从右往左分别为LED1、LED2、...、LED8&#xff0c;如下图所示 如何实现点亮单个数字&#xff0c;用下图中的ABC来实现 P2.2管脚控制A&#xff0c;P2.3管脚控制B&#xff0c;P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

云安全博客阅读(二)

2024-05-30 Cloudflare acquires BastionZero to extend Zero Trust access to IT infrastructure IT 基础设施的零信任 不同于应用安全&#xff0c;基础设置的安全的防护紧急程度更高&#xff0c;基础设施的安全防护没有统一的方案IT基础设施安全的场景多样&#xff0c;如se…

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中&#xff0c;AlarmManager 是一个非常重要的系统服务&#xff0c;用于设置定时任务或者周期性任务。无论是设置一个闹钟&#xff0c;还是定时进行数据同步&#xff0c;AlarmManager 都是不可或缺的工具之一。然而&#xff0c;随着 Android 系统的不断演…

SAP销售订单的计划行类别是什么?销售订单是如何传递需求给MRP的?

文章目录 一、销售订单计划行类别的参数二、销售订单的项目类别的配置VOV4三、计划行类别的配置VOV6四、对销售订单项目类别分配计划行类别VOV5五、自定义计划行类别 【SAP系统PP模块研究】 #SAP #SD #PP #计划 #需求传递 一、销售订单计划行类别的参数 销售订单主体包括Head…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…