Nodejs的fs模块的基础应用

news2024/9/25 9:41:08

fs模块是Node.js中内置的用于文件系统操作的模块,它提供了各种方法和函数,用于处理文件和目录。

目录

1.写入文件

2.讲讲同步和异步

3.追加写入

4.读取文件

5.文件重命名及文件移动

6.文件删除

7.文件夹的操作


1.写入文件

普通的写入方法:

用到的是fs模块的fs.writeFile()和fs.writeFileSync(),其中前者是异步方法,后者是同步方法。

语法格式:下面的代码执行会找到对应的文件写入str字符串,如果没有该文件,则会自动创建文件并写入,但是这种写入会将原来的文件直接覆盖掉。

异步方法:

const fs = require('fs')
let str = 'hello'
//会直接覆盖写入,如果没有文件夹会自动创建新的文件夹
fs.writeFile('1.txt', str, (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('写入成功1')
})

同步方法:

因为同步方法是没有错误的回调函数的,所以这里我们需要手动的去接收错误

const fs = require('fs')
try {
  fs.writeFileSync('1.txt', '11223344')
  console.log('文件写入成功')
} catch (error) {
  console.error('文件写入失败:', error)
}

 流式写入:

const fs = require('fs')
let ws = fs.createWriteStream('1.txt')
ws.write('111\n')
ws.write('222\n')
ws.close()

 流式写入和普通写入的区别:

  1. 写入方式:普通的写入文件方法是一次性将要写入的数据加载到内存中,然后将整个数据块写入文件。而流式写入文件方法是逐步将数据写入文件,一次只写入一小部分数据。

  2. 内存占用:普通的写入文件方法在写入数据之前需要将所有数据加载到内存中,因此在写入大量数据时,可能会占用较多的内存。而流式写入文件方法逐步写入数据,只需要一小部分数据存在内存中,因此对内存的占用较少。

  3. 扩展性:普通的写入文件方法适用于小数据量的写入,而流式写入文件方法适用于大数据量或者需要实时写入的场景。流式写入可以实时将数据写入文件,适用于处理大型文件或需要持续写入的情况,例如日志记录器或实时数据流。

  4. 性能和效率:普通的写入文件方法在写入大量数据时可能会有较长的等待时间,因为需要一次性将所有数据写入。而流式写入文件方法通过逐步写入数据流实现实时写入,并在处理大量数据时具有更好的性能和效率。

综上所述,普通的写入文件方法适用于较小数据量的一次性写入,而流式写入文件方法适用于需要处理大量数据或实时写入的情况。流式写入文件方法可以提供更好的性能和扩展性,并且在数据量较大时对内存的占用较少。

2.讲讲同步和异步

大家其实可以看到上面的写入方法一种是同步一种是异步,它们有什么区别呢,又或者什么时候该用什么呢?

执行流程:

js代码的执行流程大家应该都清楚,是自上而下顺序执行的,同步就是这样,他是按照顺序来执行的,即在调用一个同步方法时,程序会等待该方法完成后再继续执行下一条语句。而异步方法是非阻塞的,它会立即返回,不会等待操作完成。异步方法通常会接受一个回调函数或返回一个 Promise 对象,当操作完成时,会通过回调函数或 Promise 的处理机制来处理结果。

我们可以通过下面的代码例子来看看执行流程 

const fs = require('fs')
let str = 'hello'
//会直接覆盖写入,如果没有文件夹会自动创建新的文件夹
fs.writeFile('1.txt', str, (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('异步写入成功')
})

try {
  fs.writeFileSync('1.txt', '11223344')
  console.log('同步写入成功')
} catch (error) {
  console.error('文件写入失败:', error)
}

console.log('全部代码执行完毕')

 

可以看到在同步写入完成后才执行后面的代码,而异步方法是最后在执行的,他不会影响整个代码的执行流程,由此可以做出假设,假如我们写入的文件非常大,使用同步方法的话就会让代码暂时陷入阻塞的情况,而异步不会存在这样的问题。

由此可以得出结论,同步方法可以更加方便和直观,特别是在简单的脚本或处理逻辑较为简单的程序中,但是如果处理的是大文件,建议使用异步方法。

3.追加写入

异步方法:

我们前面的写入文件都是覆盖写入,执行后前面的文件就被覆盖了,要想实现追加写入,需要用到下面的方法,其中的\r\n都是换行的意思

const fs = require('fs')
fs.appendFile('1.txt', '\r\n111', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('追加成功')
})

同步方法:

try {
  fs.appendFileSync('1.txt', '\r\n222')
  console.log('同步追加成功')
} catch (error) {
  console.error('文件写入失败:', error)
}

4.读取文件

读取文件也是存在同步和异步的

const fs = require('fs')
//异步读取
fs.readFile('./1.txt', (err, data) => {
  if (err) {
    console.log(err)
    return
  }
  console.log(data.toString())
})
//同步读取
let data = fs.readFileSync('./1.txt', 'utf-8')
console.log(data.toString())

流式读取:

const fs = require('fs')
let rs = fs.createReadStream('./1.txt')
rs.on('data', (chunk) => {
  console.log(chunk.toString())
})
rs.on('end', () => {
  console.log('读取完成')
})
rs.on('error', (err) => {
  console.log(err)
})

流式读取和普通的读取方法最显著的区别仍然是速度的问题

5.文件重命名及文件移动

文件重命名

const fs = require('fs')
fs.rename('./1.txt', './修改.txt', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('重命名成功')
})

文件的移动

其实运用的还是重命名的方法,进行位置移动


fs.rename('./修改.txt', '../test/1.txt', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('重命名成功')
})

6.文件删除

二种方法均可

const fs = require('fs')
fs.unlink('./2.txt', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('删除成功')
})

fs.rm('./1.txt', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('删除成功')
})

7.文件夹的操作

创建文件夹

const fs = require('fs')
fs.mkdir('./html', (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('创建成功')
})

递归创建,即为创建多层结构的文件夹

const fs = require('fs')
//递归创建

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

 读取文件夹目录内容

const fs = require('fs')
//读取文件夹
fs.readdir('../fs模块', (err, files) => {
  if (err) {
    console.log(err)
    return
  }
  console.log(files)
})

运行结果

 删除文件夹(只能删除单层结构的文件夹)

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

递归删除多层结构的文件夹

const fs = require('fs')
//递归删除 官方不建议使用此方法,未来会被删除
fs.rmdir('./html', { recursive: true }, (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('删除成功')
})

//官方建议删除方法
fs.rm('./a', { recursive: true }, (err) => {
  if (err) {
    console.log(err)
    return
  }
  console.log('删除成功')
})

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

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

相关文章

智能制造企业如何建立大客户管理模型?

01、大客户管理依然是智能制造企业经营的黄金定律 《连线》杂志创始人凯文凯利(Kevin Kelly)在《技术元素》一书中写道:“数量不是目的,质量才是根本,重视1%的超级用户才是提高效率的关键。” 根据“二八定律”&…

Arduino驱动MQ4模拟甲烷气体传感器(气体传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 MQ4气体传感器,可以很灵敏的检测到空气中的甲烷、天然气等气体,但是对乙醇和烟雾的灵敏度很低。与Arduino结合使用,可以制作火灾甲烷、天然气泄露报警等相关的作品。 1、传感器特性 MQ4对不同种类、不同浓度的气体有不同的…

SystemVerilog数组参数传递及引用方法总结

一、将常数数组传递给task/function 如下面的程序,将一个常数数组传递给function module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] %0d", i, array[i]);endendfunctioninitial beginarray_tes…

@Transactional详解(作用、失效场景与解决方法)

一、了解Transactional注解,先要知道事务是什么,但既然知道了这个注解,不知道事务是什么,那就重新再去学习一遍数据库吧,这里讲解开发中代码实现事务的方式 1、编程式事务(开发用的很少了) 基于…

【火炬之光-召唤装备】

头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注*邪龙头冠无限要塞/血抗血抗血抗***终焉复临任意攻速单手武器/黑峡烬盾1召唤等级血抗*原点的寒冬1召唤等级1.刷钢铁炼境监视者-无垢之墙升级。2.不能用典狱官的胸针参考视频机械领主无限要塞––***终焉复临––求生之欲––参考视…

Zoho CRM有哪些功能?使用体验如何?

市场上有很多CRM品牌,但是Zoho CRM是比较亮眼的存在,不仅屡获CRM国际大奖,更是连续十一年入选Gartner魔力象限。不论是功能、价格还是使用体验,都备受用户青睐。下面我们就来说说,Zoho CRM的使用体验评价。 Zoho CRM有…

Codeforces Round 888 (Div. 3)F题题解

文章目录 [Lisa and the Martians](https://codeforces.com/contest/1851/problem/F)问题建模问题分析1.分析给定的运算操作2.方法1使用Trie树来查找最符合的数代码 方法2通过性质,排序后找运算的最大值代码 证明 Lisa and the Martians 问题建模 ​ 给定n个数和k&…

如何搭建一个口才培训的网站?需要具备哪些条件?

论文题目:如何搭建一个口才培训的网站及所需条件 摘要: 本文探讨了如何搭建一个口才培训的网站,并详细分析了所需的关键条件。口才培训作为一种重要的社交技能,能够帮助人们提升自信和影响力,因此具有广阔的市场前景。…

【yolov5训练报错Wandb wandb.errors.UsageError: api_key not configured (no-tty).】

跑yolov5训练官方代码出现下面的问题,第一个方法就是关闭代理网络vpn,直接运行,阻止数据上传。 D:\anaconda\envs\yolov5\python.exe C:\Users\ljx\Desktop\yoloair-main\yoloair-main\yolov7\train.py YOLOR 2022-11-8 torch 1.8.1cu111…

Nginx 高性能内存池 ----【学习笔记】

跟着这篇文章学习: c代码实现一个高性能内存池(超详细版本)_c 内存池库_linux大本营的博客-CSDN博客https://blog.csdn.net/qq_40989769/article/details/130874660以及这个视频学习: nginx的内存池_哔哩哔哩_bilibilihttps://w…

TikTok马来西亚站变动,指定物流服务商!

8月2日,据TechinAsia报道,TikTok已将百世快递在马来西亚的子公司BestExpressMalaysia,指定为其在马来西亚的物流服务商。目前,百世快递已在越南、泰国与TikTok展开类似合作。 合作后,百世马来子公司将为TikTokShop卖家…

js去除字符串中特殊字符并将数据转为数组格式

let str今-天-空-气-很-清-新;let liststr.split(-);console.log(list)使用split将特殊字符去除并将数据转为数组

解决vite+vue3项目npm装包失败

报错如下: Failed to remove some directories [ npm WARN cleanup [ npm WARN cleanup D:\\V3Work\\v3project\\node_modules\\vue, npm WARN cleanup [Error: EPERM: operation not permitted, rmdir D:\V3Work\v3project\node_modules\vue\reactivity\…

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章&#xff1…

Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…

产品经理之路:从C端到B端的崭新旅程

理解C端和B端 在我们开始探讨从C端产品经理到B端产品经理的转变之前,我们首先需要理解C端和B端是什么,以及它们之间有什么区别。 C端产品与B端产品的基本区别 C端产品(Consumer端产品)是面向普通消费者的产品,如社交…

大数据课程F4——HIve的其他操作

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化; 一、jo…

一个对象的内存图,两个对象使用同一个方法的内存图

一个对象的内存图 public class Phone {String brand; //品牌double price; //价格String color; //颜色public void call(String who) {System.out.println("给" who "打电话");}public void sendMessage() {System.out.println("群发短信");…

【第一阶段】kotlin的range表达式

range:范围:从哪里到哪里的意思 in:表示在 !in:表示不在 … :表示range表达式 代码示例: fun main() {var num:Int20if(num in 0..9){println("差劲")}else if(num in 10..59){println("不及格")}else if(num in 60..89…

2023年自动化测试已成为标配?一篇彻底打通自动化测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先我们从招聘岗…