Skip to content

在 Node.js 中使用文件描述符

在能够与文件系统中的文件交互之前,必须获取文件描述符。文件描述符是对打开文件的引用,它是使用 fs 模块提供的 open() 方法打开文件后返回的一个数字 (fd)。这个数字 (fd) 在操作系统中唯一标识一个打开的文件。

打开文件

CommonJS (CJS)

javascript
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fd 是我们的文件描述符
})

注意我们作为 fs.open() 调用的第二个参数使用的 'r'。该标志表示我们将文件打开以进行读取。您通常还会使用其他标志:

标志描述
'w+'此标志以读写方式打开文件。它将流定位在文件的开头。
'a+'此标志以读写方式打开文件,并将流定位在文件的末尾。

您也可以使用 fs.openSync 方法打开文件,该方法返回文件描述符,而不是在回调中提供它:

javascript
const fs = require('node:fs')

try {
  const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
  console.error(err)
}

执行操作

一旦你通过任何你选择的方式获得了文件描述符,你就可以执行所有需要它的操作,例如调用 fs.close() 和许多其他与文件系统交互的操作。

使用 fsPromises

你也可以使用 fs/promises 模块提供的基于 Promise 的 fsPromises.open 方法打开文件。fs/promises 模块仅从 Node.js v14 开始可用。在 v14 之前,v10 之后,你可以使用 require('fs').promises。在 v10 之前,v8 之后,你可以使用 util.promisifyfs 方法转换为基于 Promise 的方法。

ES 模块 (MJS)

javascript
import fs from 'node:fs/promises'

async function run() {
  const fileHandle = await fs.open('example.txt', 'r')
  try {
    filehandle = await fs.open('/Users/joe/test.txt', 'r')
    console.log(filehandle.fd)
    console.log(await filehandle.readFile({ encoding: 'utf8' }))
  } finally {
    await fileHandle.close()
  }
}

run().catch(console.error)

util.promisify 示例

以下是使用 util.promisifyfs.open 转换为基于 Promise 的函数的示例:

javascript
const fs = require('node:fs')
const util = require('node:util')

const open = util.promisify(fs.open)

open('test.txt', 'r')
  .then(fd => {
    // 使用文件描述符
  })
  .catch(err => {
    // 处理错误
  })

要查看有关 fs/promises 模块的更多详细信息,请查看 fs/promises API 文档