一次搞定 Node 的文件操作

写在前面


一直在做前端开发 🥗,接触到服务端的机会很少,但是随着技术的发展和业务的需要可能就会有用 Node 来开发服务端或者编写工程化的工具的需求,如果你是一名前端开发,那么学习 Node 是一个最好的选择,因为都是使用 JS 来开发的,相对于学习 Java 等其他语言,学习 Node 的成本是比较低的,其次在服务器开发的领域,Node 的性能也是比较高的,所以对于前端开发者非常的友好,学习 Node 能够更好的满足自己的需求,这篇文章我们将会学习一下 Node 的基础知识,逐渐踏入 Node 服务器开发的领域,好了,废话少说,让我们开始吧 🐲~

一.服务端开发


这幅图展示的是一个完整的软件系统,包括很多个部分,我们可以看到图中不仅仅包含,网页端,电脑端,手机端等等,在这个软件系统中,最重要的就是服务端,因为服务端是给各个客户端提供数据的,常见的服务端技术方案有很多,在国内使用最频繁的是 Java 语言,那么为什么推荐 Node 哪?因为 Node 可以直接使用 JS 来开发,减少了很多的学习成本,其次 Node 的性能是比较高的,在后续学习的 SSR 中其实就是使用 Node 来做的服务端渲染的。

二.Node.js 是什么?


官方对 Node 的定义是,Node.js是一个基于 V8 引擎的 JavaScript 运行环境,也就是说 Node 是基于 V8 引擎来运行 JavaScript 代码的,但是不仅仅只有 V8 引擎。

  • 前面我们知道 V8 可以用来嵌入到任何 C++应用程序中,无论是 Chorme 还是 Node.js,事实上都是嵌入了 V8 引擎来执行 JavaScript 代码的。
  • 但是在 Chorme 浏览器中,还需要解析,渲染 HTML,CSS 等相关渲染引擎,另外还需要提供支持浏览器操作的 API,浏览器自己的事件循环等。
  • 另外,在 Node.js 中我们也需要进行一些额外的操作,比如文件的读写,网络 IO,加密,压缩解压文件等。

三.Node 和浏览器的区别


四.Node.js 的架构


我们编写的Application会交给V8 引擎 进行解析,然后通过Node.js BindingsLIBUV进行交互,任务会进入 Event Queue 通过事件循环来进行执行调用操作系统,当任务执行完毕后又会通过回调函数进行逐步返回。

五.内置模块 fs


fs 是File System的缩写,表示文件系统,对于任何一个为服务器端服务的语言或者框架通常都会有自己的文件系统,因为服务器需要将各种数据,文件等放置到不同的地方,比如用户数据可能大多数是放在数据库中,比如某些配置文件或者用户资源(图片,音视频)都是以文件的形式存在于操作系统上的,Node 也有自己的文件系统操作模块,就是 fs,借助与 Node 帮我们封装的系统,我们就可以在任务,这也是 Node 可以开发服务器的一个原因,也是它可以成为前端自动化脚本等热门工具的原因。

六.fs 的 API 介绍


fs 中的 API 非常的多,我们没有必要去一个一个的学习,在使用到的时候可以单独的查找 nodejs.org/docs/latest... 但是这些 API 大致分为三类:

方式一:同步操作文件,代码会被阻塞,不会继续执行。

js 复制代码
const fs = require('fs')

const state = fs.readFileSync('./files/files.txt', {
  encoding: 'utf-8',
})

console.log(state)

方式二:异步回调函数操作文件,文件不会被阻塞,需要传入回调函数,当获取到结果的时候,回调函数被执行。

js 复制代码
const fs = require('fs')

fs.readFile('./files/files.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('文件读取发生错误~')
    return
  }
  console.log(data)
})

方式三:异步 Promise 操作文件,代码不会被阻塞,通过fs.promises调用方法操作,会返回一个 Promise,可以通过 then 和 catch 进行处理。

js 复制代码
const fs = require('fs')
const state = fs.promises.readFile('./files/files.txt', {
  encoding: 'utf-8',
})

state.then((res) => {
  console.log(res)
})

七.文件描述符


文件描述符是什么呢?😆 在常见的操作系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源表格,每个打开的文件都分配了一个称为文件描述符的简单的数字标识符,在系统层,所有的文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件,Window 系统使用了一个虽然不同,但是概念上类似的机制来跟踪资源,为了简化用户的工作,Node 抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符。

fs.open()方法用于分配新的文件描述符,一旦被分配,则文件描述符可用于从文件读取数据,向文件写入数据,或请求关于文件的信息。

js 复制代码
const fs = require('fs')

fs.open('./files/files.txt', 'r', (err, fd) => {
  console.log(fd)
  fs.fstat(fd, (err, state) => {
    // 获取文件描述符指定的文件信息
    console.log(state)
    fs.close(fd) // 对打开的文件进行关闭
  })
})

八.文件的读写


如果我们想要对文件的内容进行操作,这个时候可以使用文件的读写

文件的读取:fs.readFile(path[, options], callback)

js 复制代码
const fs = require('fs')

fs.readFile('./files/files.txt', 'utf8', (err, data) => {
  if (err) {
    console.log('文件读取发生错误~')
    return
  }
  console.log(data)
})

文件的写入:fs.writeFile(file, data[, options], callback)

js 复制代码
const fs = require('fs')

const content = '人间不过是你~'

fs.writeFile('./files/files.txt', content, { flag: 'a+' }, (err) => {
  console.log(err)
})

在上述的代码中你可能会发现有一个对象类型,这个是写入时候填入的option参数

  1. flag:写入的方式
  2. encoding:字符的编码

九.flag 选项


我们先来看 flag,flag 的值有很多: nodejs.org/dist/latest...

  • w 打开文件写入,默认值
  • w+打开文件进行读写(可读可写),如果不存在则创建文件
  • r打开文件读取,读取时的默认值
  • r+ 打开文件进行读写,如果不存在那么抛出异常
  • a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件
  • a+打开文件以进行读写(可读可写),将流放在文件末尾。如果不存在则创建文件

十.encoding 选项


目前我们在开发中基本使用的都是utf-8 在文件读取中,如果不填写encoding的话,返回的结果是Buffer

十一.文件夹操作


fs模块除了可以对某一个文件进行操作之外,还可以通过fs.mkdir()fs.mkdirSync()操作文件夹.

获取文件夹的内容

js 复制代码
const fs = require('fs')

function readDirectory(dir) {
  fs.readdir(dir, { withFileTypes: true }, (err, files) => {
    files.forEach((item) => {
      if (item.isDirectory()) {
        readDirectory(`${dir}/${item.name}`)
      } else {
        console.log(item.name)
      }
    })
  })
}

readDirectory('./fileDictory')

文件重命名

js 复制代码
const fs = require('fs')

fs.rename('./fileDictory', './fileDictoryNew', (err) => {
  console.log(err)
})

十二.总结与回顾


这篇文章到这里就结束了 🥗,这篇文章我们了解了 Node 的基本概念,了解了 Node 和浏览器的区别,这篇文章的主要内容是文件和文件夹的基本操作,常见的文件夹操作有很多,但是基本上分为三类,分别是同步,异步,异步 Promise 三类,我们还可以通过文件描述符来间接的对文件进行操作,fs模块除了对文件进行操作,还可以对文件夹进行操作,我们一般会通过递归的方式来对文件夹进行获取,还可以对文件夹进行重命名等等。

相关推荐
崽崽的谷雨16 分钟前
react实现一个列表的拖拽排序(react实现拖拽)
前端·react.js·前端框架
小小坤1 小时前
前端基于AI生成H5 vue3 UI组件
前端·javascript·vue.js
既见君子1 小时前
透明视频
前端
竹等寒1 小时前
Go红队开发—web网络编程
开发语言·前端·网络·安全·web安全·golang
lhhbk1 小时前
angular中下载接口返回文件
前端·javascript·angular·angular.js
YUELEI1181 小时前
Vue使用ScreenFull插件实现全屏切换
前端·javascript·vue.js
我自纵横20232 小时前
第一章:欢迎来到 HTML 星球!
前端·html
发财哥fdy2 小时前
3.12-2 html
前端·html
ziyu_jia2 小时前
React 组件测试【React Testing Library】
前端·react.js·前端框架