Работа с файловыми дескрипторами в Node.js
Прежде чем вы сможете взаимодействовать с файлом, находящимся в вашей файловой системе, вы должны получить файловый дескриптор. Файловый дескриптор - это ссылка на открытый файл, число (fd), возвращаемое при открытии файла с помощью метода open()
, предоставляемого модулем fs
. Это число (fd) однозначно идентифицирует открытый файл в операционной системе.
Открытие файлов
CommonJS (CJS)
const fs = require('node:fs');
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fd - это наш файловый дескриптор
});
Обратите внимание на 'r'
, который мы использовали в качестве второго параметра при вызове fs.open()
. Этот флаг означает, что мы открываем файл для чтения. Другие флаги, которые вы будете часто использовать:
Флаг | Описание |
---|---|
'w+' | Этот флаг открывает файл для чтения и записи. Он помещает поток в начало файла. |
'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()
и многие другие операции, которые взаимодействуют с файловой системой.
Использование fsPromises
Вы также можете открыть файл с помощью метода fsPromises.open
на основе промисов, предоставляемого модулем fs/promises
. Модуль fs/promises
доступен только начиная с Node.js v14. До v14, после v10, вы можете использовать require('fs').promises
вместо этого. До v10, после v8, вы можете использовать util.promisify
для преобразования методов fs
в методы на основе промисов.
ES Modules (MJS)
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.promisify
для преобразования fs.open
в функцию на основе промисов:
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
, пожалуйста, ознакомьтесь с документацией API fs/promises.