欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何在Nodejs中使用模块fs文件系统

程序员文章站 2022-03-07 07:54:28
概述node 的fs文档密密麻麻的 api 非常多,毕竟全面支持对文件系统的操作。文档组织的很好,操作基本分为文件操作、目录操作、文件信息、流这个大方面,编程方式也支持同步、异步和 promise。本...

概述

node 的fs文档密密麻麻的 api 非常多,毕竟全面支持对文件系统的操作。文档组织的很好,操作基本分为文件操作、目录操作、文件信息、流这个大方面,编程方式也支持同步、异步和 promise。

本文记录了几个文档中没详细描写的问题,可以更好地串联fs文档思路:

  • 文件描述符
  • 同步、异步与 promise
  • 目录与目录项
  • 文件信息
  • stream

文件描述符

文件描述符是一个非负整数。它是一个索引值,操作系统可以根据它来找到对应的文件。

在 fs 的很多底层 api 中,需要用到文件描述符。在文档中,描述符通常用fd来代表。例如:fs.read(fd, buffer, offset, length, position, callback)。与这个 api 相对应的是:fs.readfile(path[, options], callback)。

因为操作系统对文件描述符的数量有限制,因此在结束文件操作后,别忘记 close:

同步、异步与 promise

所有文件系统的 api 都有同步和异步两种形式。

同步写法

不推荐使用同步 api,会阻塞线程。

异步写法

异步写法写起来容易进入回调地狱。

(推荐)promise 写法

在 node v12 之前,需要自己借助 promise 封装:

在 node v12 中,引入了 fs promise api。它们返回 promise 对象而不是使用回调。 api 可通过require('fs').promises访问。如此一来,开发成本更低了。

目录与目录项

fs.dir 类:封装了和文件目录相关的操作

fs.dirent 类:封装了目录项的相关操作。例如判断设备类型(字符、块、fifo 等)。

它们之间的关系,通过代码展示:

文件信息

fs.stats 类:封装了文件信息相关的操作。它在fs.stat()的回调函数中返回。

注意,关于检查文件是否存在:

  • 不建议在调用 fs.open()、 fs.readfile() 或 fs.writefile() 之前使用 fs.stat() 检查文件是否存在。而是应该直接打开、读取或写入文件,如果文件不可用则处理引发的错误。
  • 要检查文件是否存在但随后并不对其进行操作,则建议使用 fs.access()

readstream 与 writestream

在 nodejs 中,stream 是个非常重要的库。很多库的 api 都是基于 stream 来封装的。例如下面要说的 fs 中的 readstream 和 writestream。

fs 本身提供了 readfile 和 writefile,它们好用的代价就是性能有问题,会将内容一次全部载入内存。但是对于几 gb 的大文件,显然会有问题。

那么针对大文件的解决方案自然是:一点点读出来。这就需要用到 stream 了。以 readstream 为例,代码如下:

借助 stream 的 pipe,一行快速封装一个大文件的拷贝函数:

以上就是如何在nodejs中使用模块fs文件系统的详细内容,更多关于nodejs的资料请关注其它相关文章!

相关标签: nodejs fs 文件