Skip to content
On this page

Node fs模块一览

所有的文件系统操作都有异步和同步两种形式,只介绍异步方法。

异步形式的最后一个参数都是完成时回调函数。 传给回调函数的参数取决于具体方法,但回调函数的第一个参数都会保留给异常。 如果操作成功完成,则第一个参数会是 null 或 undefined。

fs模块常用方法一览

fs.open()
fs.close()
fs.readFile()
fs.writeFile()
fs.read()
fs.readdir()
fs.mkdir()
fs.rmdir()
fs.Stats 类
fs.WriteStrame 类
fs.ReadStream 类

fs Promise API 需要node v10.0.0版本才支持。

1. 文件路径

支持

  • 字符串
  • Buffer
  • 使用file:协议的URL对象
    const url = reuqire('url')
    fs.readFile(new url.URL('file:///tmp/hello'))
    

2. fs.open

  • path String|Buffer|URL
  • flags String|Number
    • r+ 读写,如果文件不存在则抛出异常
    • r 只读
    • w 只写,如果文件不存在则创建
    • w+ 读写,文件不存在则创建
    • a+ 读取追加,文件不存在则创建
  • mode integer 0666
  • callback
    • err Error
    • fd integer close时传递

fs.open会分配一个新的文件描述符, 一旦分配了,文件描述符可用于读取数据、写入数据、或查看文件信息。大多数操作系统会限制打开的文件描述符的数量,所以当操作完成时需关闭描述符。 如果不这样做会导致内存泄漏,最终造成应用崩溃。

fs.open(`${__dirname}/demo.txt`, 'w+', (err, fd) => {
  console.log(fd)
  fs.close(fd, err => {
    if (err) throw err
  })
})

3. fs. readFile

异步地读取一个文件的全部内容

  • path 同上
  • options
    • encoding
    • flag 同上
  • callback
    • err Error
    • data String|Buffer
fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err
  console.log(data)
})

4. fs.writeFile

异步地写入数据到文件,如果文件已经存在,则覆盖文件

  • file String|Buffer|URL|integer
  • data String|Buffer|Uint8Array
  • options
    • encoding
    • mode
    • flag
  • callback
    • err
fs.writeFile('./tmp/文件名.txt', 'Node.js', err => {
  if (err) throw err
  console.log('文件已保存!')
})

5. fs.read

使用文件描述符来读取文件

  • fd 通过 fs.open() 方法返回的文件描述符
  • buffer 数据将被写入到的 buffer,也就是用来存放读取数据的缓冲区
  • offset 缓冲区写入的写入偏移量
  • length 要从文件中读取的字节数
  • position 文件读取的起始位置
  • callback
    • err
    • bytesRead 读取的字节数
    • buffer 缓冲区对象
const fs = reuqire('fs')
const buf = new Buffer.alloc(1024)

fs.open('./tmp/demo.txt', 'r+', (err, fd) => {
  fs.read(fd, buf, 0, buf.length, 0, (err, bytes) => {
    // 仅输出读取的字节
    if(bytes > 0){
       console.log(buf.slice(0, bytes).toString())
    }
  })
})

6. fs.readdir

读取一个目录的内容

  • path
  • options
    • encoding
  • callback
    • err
    • files String[]|Buffer[] 目录中不包括 '.''..' 的文件名的数组
fs.readdir('/tmp/', (err, files) => {
   if (err) {
       return console.error(err)
   }
   files.forEach( function (file){
       console.log( file )
   })
})

7. fs.mkdir

  • path
  • mode 默认是0777
  • callback 无参数

8. fs.rmdir

  • path
  • callback 无参数

9. fs.Stats

用来获取一个文件的信息

  • fs.stat()
  • fs.lstat()
  • fs.fstat()

如果传入这些函数的 options 中的 bigint 为 true,则数值会是 bigint 型而不是 number 型。

fs.stat('./demo.txt', (err, stats) => {
  console.log(stats.isFile()) // true
})

stats可以用来判断当前path是什么类型,返回布尔值。

方法描述
stats.isFile()文件
stats.isDirectory()目录
stats.isSocket()socket
stats.size文件字节大小

参考