Чем отличаются fs.stat, fs.fstat, fs.lstat?nodejs-15

Все три метода относятся к модулю fs (File System) и используются для получения информации о файлах, но имеют важные различия в поведении и применении.

fs.stat

Основной метод для получения информации о файле или директории по указанному пути.

Особенности:

  • Работает с путями (строками)
  • Следует символическим ссылкам (возвращает информацию о конечном файле)
  • Может вызывать ошибку ENOENT если файл не существует

Пример:

const fs = require('fs');

fs.stat('/path/to/file', (err, stats) => {
  if (err) throw err;
  console.log(stats);
});

fs.fstat

Работает с файловым дескриптором (file descriptor) вместо пути.

Особенности:

  • Принимает файловый дескриптор (число)
  • Полезен когда файл уже открыт
  • Не требует дополнительных проверок прав доступа
  • Быстрее чем fs.stat (так как файл уже открыт)

Пример:

const fs = require('fs');

fs.open('/path/to/file', 'r', (err, fd) => {
  if (err) throw err;

  fs.fstat(fd, (err, stats) => {
    if (err) throw err;
    console.log(stats);
    fs.close(fd);
  });
});

fs.lstat

Аналогичен fs.stat, но не следует символическим ссылкам.

Особенности:

  • Возвращает информацию о самой символической ссылке, а не о файле, на который она указывает
  • Полезен для определения, является ли файл символической ссылкой
  • stats.isSymbolicLink() вернет true для символических ссылок

Пример:

const fs = require('fs');

fs.lstat('/path/to/symlink', (err, stats) => {
  if (err) throw err;
  console.log(stats.isSymbolicLink()); // true для симлинков
});

Сравнение поведения

Рассмотрим ситуацию с символической ссылкой /link указывающей на /real/file:

Метод Возвращаемая информация isSymbolicLink()
fs.statО /real/filefalse
fs.lstatО /linktrue
fs.fstatЗависит от того, открыли ли сам симлинк или конечный файл

Производительность

  1. fs.fstat - самый быстрый (работает с уже открытым файлом)
  2. fs.lstat - быстрее fs.stat когда нужно проверить симлинки (не требует разрешения ссылки)
  3. fs.stat - медленнее из-за необходимости разрешать пути и симлинки

Резюмируем

  1. Используйте fs.stat когда нужна информация о конечном файле (разрешает симлинки)
  2. Применяйте fs.lstat когда нужно работать именно с символической ссылкой
  3. Выбирайте fs.fstat когда файл уже открыт и у вас есть файловый дескриптор
  4. Для проверки типа файла используйте методы stats.isFile(), stats.isDirectory() и stats.isSymbolicLink()

Все три метода возвращают объект fs.Stats с одинаковой структурой, содержащий информацию о:

  • размере файла
  • времени создания/модификации/доступа
  • правах доступа
  • типе файла (файл, директория, симлинк и т.д.)