NodeJS内置模块一:文件和文件夹操作

fs-(file system)文件系统

一、简介
  • 对于任何一个服务端语言都会有自己相应的文件系统,因为服务器需要将各种数据和文件防到不同的地方
  • Node中的文件系统就是fs,可以帮助我们再任何操作系统上(macos windows linux)等上面直接去操作文件,因为node是跨平台的
  • noded的fs Api的查询网站
二、API调用的三种方式
  • 同步操作文件(带sync)后缀的,代码会被阻塞,不会继续执行
  • 异步回调函数(不带sync后缀的)调函数来接受返回的结果,当获取到结果会调用回调函数
  • 异步Promise操作文件,代码不会被阻塞,通过fs.promise调用,会返回一个promise,可以通过.then、catch来处理
三、fs文件读取
//引入fs模块
const fs = require('node:fs')
//1、同步读取--第一个参数为文件路径,第二参数为编码格式
//不传编码格式返回的是buffer,需要转换
const res = fs.readFileSync('./abc.text', { encoding: 'utf-8' })
console.log(res);
//2、异步读取、回调函数--会存在回调地狱的情况
fs.readFile('./abc.text', { encoding: 'utf-8' }, (error, data) => {
  if (error) {
    console.log('读取文件错误');
  }
  console.log(`文件读取到内容是:`, data)
})
//3、promise调用异步
fs.promises.readFile('./abc.text', { encoding: 'utf-8' }).then(res => {
  console.log('promise读取到的结果', res)
}).catch(e => {
  console.log(`发生错误了`, e.message)
})

运行结果

image.png

文件描述符
  • 文件描述符是什么
  1. 在常见的操作系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源的表格。
  2. 每个打开的文件都分配了一个称为文件描述符的简单的数字标识符。
  3. 在系统层,所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。
  4. Windows 系统使用了一个虽然不同但概念上类似的机制来跟踪资源。
  5. 为了简化用户的工作,Node.js 抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符
  • fs.open() 方法用于分配新的文件描述符。
  • 一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。
  • 区别: 拿到文件描述符可以读取文件的信息,而不仅仅是读取或者写入
//调用fs.open--同样的有异步和同步
fs.open('./abc.text', (error, fd) => {
  if (error) return
  //返回文件描述符--number类型
  console.log('文件描述符是:', fd)

  //通过文件描述符可以读写文件
  console.log(fs.readFileSync(fd))
  //获取文件信息
  fs.fstat(fd, (error, stats) => {
    if (error) return
    console.log(stats)
  })
  //手动关闭--不然node进程关闭才会自动关闭
  fs.close(fd)
})

运行结果

image.png

四、文件的写入
//引入fs模块
const fs = require('node:fs')
//定义要写入的内容
let content = '你好啊,欢迎阅读我的笔记,我是小阿俊\n'
//写入文件--存在该文件会自动创建
fs.writeFile('./bbb.txt', content, { encoding: 'utf-8', flag: 'a+' }, (error) => {
  if (error) return;
  console.log('文件写入成功')
})
//第三个参数options{encoding--编码格式,flag---操作方式,a--表示追加}
  • flag的选项常见flag网址
    1. w 打开文件写入,默认值;
    2. w+打开文件进行读写(可读可写),如果不存在则创建文件;
    3. r打开文件读取,读取时的默认值;
    4. r+ 打开文件进行读写,如果不存在那么抛出异常;
    5. a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
    6. a+打开文件以进行读写(可读可写),将流放在文件末尾。如果不存在则创建文件
  • encoding的选项
    1. 具体参见coderWhy的一篇文章字符编码详解- 简书
五、文件夹操作
  • 文件夹创建
//引入fs模块
const fs = require('node:fs')

//创建文件夹---异步调用
//如果存在,就会失败
fs.mkdir('./我是node创建的文件夹', (err) => {
  if (err) {
    console.log('文件夹创建失败', err)
  } else {
    console.log('文件夹创建成功')
  }
})
  • 文件夹读取
  • 这是我的文件夹目录

image.png

//文件夹读取---读取到当前文件夹中的文件字符串,第一层
fs.readdir('./我是node创建的文件夹', (err, files) => {
  if (err) return
  console.log(files)//[ '111', '222', 'index.txt' ]
})
//第二中种方式,读取文件夹类型和信息--返回的是数组对象
fs.readdir('./我是node创建的文件夹', { withFileTypes: true }, (err, files) => {
  files.forEach(item => {
    if (item.isDirectory()) {
      console.log('item是一个文件夹', item.name)
    } else {
      console.log('item是一个文件', item.name)
    }
  })
})
  • ** 运行结果**

image.png

  • 拓展递归调用获取文件夹下面所有的文件
//拓展--递归获取文件夹下所有文件
function readDirectory (path) {
  fs.readdir(path, { withFileTypes: true }, (err, files) => {
    if (err) return;
    //遍历拿到的文件数组
    files.forEach(file => {
    //判断是不是文件夹
      if (file.isDirectory()) {
      //继续递归
        readDirectory(`${path}/${file.name}`)
      } else {
        console.log('我的文件名称是', file.name)
      }
    })
  })
}
readDirectory('./我是node创建的文件夹')
  • 运行结果

image.png

六、文件和文件夹的重命名
//文件夹重命名
fs.rename('./我是node创建的文件夹', './我要改名了', (err) => {
  if (err) {
    console.log('重命名失败了')
  }
})
//文件重命名
fs.rename('./我要改名了/index.txt', './我要改名了/666.txt', (err) => {
  if (err) {
    console.log('重命名失败了')
  }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北北往前飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值