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

node.js文件系统(fs) - 创建文件、打开文件、写入数据、追加数据、读取数据、创建目录、删除目录

注意:以下所有示例均是异步语法!
注意:以下所有示例均是异步语法!

创建文件

node.js 允许我们在计算机本地创建文件,例如创建一个 word 文件:

// 引入核心模块(fs)
var fs = require('fs')// API
fs.writeFile('./hello.doc', 'hello', (error) => {// 创建失败if(error){console.log(`创建失败:${error}`)}// 创建成功console.log(`创建成功!`)})
// 注意:同名/同类型文件多次创建并不会新增,而是覆盖机制

首先引入 node.js 为我们写好的核心模块 fs ,接着使用 writeFile API 进行参数配置,第一个参数(‘./hello.doc’) 为文件位置/类型/命名,第二个参数(‘hello’) 为文件默认内容。

需要注意的是,如果创建文件成功,error 的值是 null,你可以使用 console.log 来查看 error 在何是发生改变。
在这里插入图片描述

打开文件

有必要说一下语法及参数,剩下的按照参数配置进行业务编写即可。

语法

fs.open(path, flags[, mode], callback)

参数:

  1. path:文件的路径
  2. flags:文件打开的行为,具体值详表格
  3. mode:设置文件模式(权限),文件创建默认权限为 0666(可读,可写)
  4. callback:回调函数,带有两个参数如:callback(err, fd)
flags描述
r以读取模式打开文件。如果文件不存在抛出异常。
r+以读写模式打开文件。如果文件不存在抛出异常。
rs以同步的方式读取文件。
rs+以同步的方式读取和写入文件。
w以写入模式打开文件,如果文件不存在则创建。
wx类似 ‘w’,但是如果文件路径存在,则文件写入失败。
w+以读写模式打开文件,如果文件不存在则创建。
wx+类似 ‘w+’, 但是如果文件路径存在,则文件读写失败。
a以追加模式打开文件,如果文件不存在则创建。
ax类似 ‘a’, 但是如果文件路径存在,则文件追加失败。
a+以读取追加模式打开文件,如果文件不存在则创建。
ax+类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。

打开刚刚创建的 hello.doc 文件:

// 引入核心模块(fs)
var fs = require('fs')// API
fs.open('./input.txt', 'r', (err,fd) => {// 打开失败if(err){console.log(`文件打开失败:${err}`)}// 打开成功console.log(`文件打开成功!${fd}`)})

写入内容

我们可以通过 缓冲区(Buffer) / writeFile方法 来为文件写入二进制内容。

语法

fs.writeFile(file, data[, options], callback)

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。

参数

  1. file:文件名或文件描述符。
  2. data:要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
  3. options:该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’
  4. callback:回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
// 引入读写核心模块
var fs = require('fs')// 向文件中写入内容(利用缓冲区解决二进制数据问题)
var data = '\n I am input content \n'
var data = new Buffer(data)//放入缓冲区// API
fs.writeFile('input.txt', data, {flag: 'a'}, (err) => {// 写入失败if(err){console.log(`文件写入失败(${err})`)}// 写入成功console.log(`写入成功!`)})

在这里插入图片描述

追加内容

将数据追加到文件,需要注意的是,如果文件尚不存在则会创建该文件。

语法

fs.appendFile(filename,data,[options],callback);
// 引入读写核心模块
var fs = require('fs')// node.js 规定 data 可以是 string / buffer
var data = '\n 我是追加的内容! \n'
var data = new Buffer(data)//这里使用缓冲区(buffer)// API
fs.appendFile('input.txt', data, (err) => {// 追加失败if(err) throw err// 追加成功console.log('追加内容成功!')})

在这里插入图片描述

读取内容

读取文件中的内容。

语法

fs.read(fd, buffer, offset, length, position, callback)

参数

  1. fd:通过 fs.open() 方法返回的文件描述符。
  2. buffer:数据写入的缓冲区。
  3. offset:缓冲区写入的写入偏移量。
  4. length:要从文件中读取的字节数。
  5. position:文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
  6. callback:回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

input.txt 文件内容

我是内容
// 引入读写核心模块
var fs = require('fs')// 读取 input.txt 文件(异步非阻塞式)
fs.readFile('input.txt', (err,data) => {// 读取失败if(err) throw err// 读取成功console.log('- - - - - - - - - - - - - - - - - - - - -')console.log(`input.txt:${data}`)console.log('- - - - - - - - - - - - - - - - - - - - -')})

在这里插入图片描述

创建目录

创建一个目录,需要注意的是,在 Windows 上,在根目录上使用 fs.mkdir() (即使使用递归参数)也会导致错误。

语法

fs.mkdir(path[, options], callback)

参数

  1. path:文件路径。
  2. options:recursive - 是否以递归的方式创建目录,默认为 false。mode - 设置目录权限,默认为 0777。
  3. callbac:回调函数,没有参数。
// 引入读写核心模块
var fs = require('fs')// 注意:目录的根必须存在
console.log('即将开始创建...')
fs.mkdir("/data/new", (err) => {// 创建失败if(err) throw err// 创建成功console.log('文件创建成功!')
})

在这里插入图片描述
注意:如果创建的目录已经存在,则会提示如下Error:

Error: EEXIST: file already exists, mkdir 'C:\data\new'

删除目录

删除一个已经存在的目录,需要注意的是,在递归模式中,如果 path 不存在则不报告错误,并且在失败时重试操作。

语法

fs.rmdir(path, callback)

参数

  1. path:文件路径。
  2. callback:回调函数。
// 引入读写核心模块
var fs = require('fs')// 删除前一个创建的目录(/data/new)
console.log('准备执行删除目录操作')
fs.rmdir("/data/new", (err) => {// 删除失败if(err) throw err// 删除成功console.log('删除目录成功!')})

在这里插入图片描述

相关文章:

  • 【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
  • 操作系统|| 虚拟内存页置换算法
  • COMSOL随机参数化表面流体流动模拟
  • 记录算法笔记(2025.5.15)将有序数组转换为二叉搜索树
  • 城市排水管网流量监测系统解决方案
  • CS016-4-unity ecs
  • MySQL高效开发规范
  • 基于SpringBoot的房屋租赁管理系统
  • C语言的9*9乘法表(两种思路,选择适合自己的。)
  • 使用 OpenCV 将图像中标记特定颜色区域
  • 根据台账批量制作个人表
  • idea运行
  • 时源芯微|EMC常用器件原理及选型
  • Mybatis-plus 条件构造器 Wrapper
  • ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例
  • uni-app x正式支持鸿蒙原生应用开发
  • 【HTML5学习笔记1】html标签(上)
  • mac M芯片运行docker-desktop异常问题
  • Protobuf——Protocol Buffer详解(1)
  • 基于 Flink 的实时推荐系统:从协同过滤到多模态语义理解
  • 内塔尼亚胡:以军将在未来几天“全力进入”加沙
  • 多家外资看好中国市场!野村建议“战术超配”,花旗上调恒指目标价
  • 专访|茸主:杀回UFC,只为给自己一个交代
  • 杭州钱塘区3宗涉宅用地均以底价成交,共计成交金额25.73亿元
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 智能手表眼镜等存泄密隐患,国安部提醒:严禁在涉密场所使用