在 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.promisify` 将 `fs` 方法转换为基于 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。