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

在能够与文件系统中存在的文件交互之前,您必须获得文件描述符。

文件描述符是对打开文件的引用,是由 fs 模块提供的 open() 方法打开文件返回的数字 (fd)。此数字 (fd) 唯一标识操作系统中的打开文件

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

fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fd is our file descriptor
});

请注意我们用作 fs.open() 调用的第二个参数的 r

该标志表示我们打开文件进行读取。

您常用的其他标志是

标志描述如果文件不存在,则创建文件
r+此标志打开文件进行读取和写入
w+此标志打开文件进行读取和写入,并且还将流定位在文件的开头
a此标志打开文件进行写入,并且还将流定位在文件的末尾
a+此标志打开文件进行读取和写入,并且还将流定位在文件的末尾

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

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

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

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

您还可以使用 fs/promises 模块提供的基于 Promise 的 fsPromises.open 方法打开文件。

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

const fs = require('node:fs/promises');
// Or const fs = require('fs').promises before v14.
async function example() {
  let filehandle;
  try {
    filehandle = await fs.open('/Users/joe/test.txt', 'r');
    console.log(filehandle.fd);
    console.log(await filehandle.readFile({ encoding: 'utf8' }));
  } finally {
    if (filehandle) await filehandle.close();
  }
}
example();

这是一个 util.promisify 的例子

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

async function example() {
  const open = util.promisify(fs.open);
  const fd = await open('/Users/joe/test.txt', 'r');
}
example();

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

阅读时间
2 分钟
作者
flaviocopesMyles BorinsfhembergerLaRuaNaahmadawaisclean99vaishnav-mk
贡献
编辑此页