Skip to content

Работа с файловыми дескрипторами в Node.js

Прежде чем вы сможете взаимодействовать с файлом, находящимся в вашей файловой системе, вы должны получить файловый дескриптор. Файловый дескриптор - это ссылка на открытый файл, число (fd), возвращаемое при открытии файла с помощью метода open(), предоставляемого модулем fs. Это число (fd) однозначно идентифицирует открытый файл в операционной системе.

Открытие файлов

CommonJS (CJS)

javascript
const fs = require('node:fs');
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fd - это наш файловый дескриптор
});

Обратите внимание на 'r', который мы использовали в качестве второго параметра при вызове fs.open(). Этот флаг означает, что мы открываем файл для чтения. Другие флаги, которые вы будете часто использовать:

ФлагОписание
'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

Вы также можете открыть файл с помощью метода fsPromises.open на основе промисов, предоставляемого модулем fs/promises. Модуль fs/promises доступен только начиная с Node.js v14. До v14, после v10, вы можете использовать require('fs').promises вместо этого. До v10, после v8, вы можете использовать util.promisify для преобразования методов fs в методы на основе промисов.

ES Modules (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.promisify для преобразования fs.open в функцию на основе промисов:

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, пожалуйста, ознакомьтесь с документацией API fs/promises.