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