Статьи

Доступ к файловой системе в Node.js

В течение многих лет JavaScript имел очень ограниченный доступ к файловой системе. Конечно, большую часть своей жизни JavaScript жил в браузере. Для языка веб-сценариев доступ к файловой системе считался серьезной угрозой безопасности. Разработчики внешнего интерфейса были вынуждены сделать это благодаря файлам cookie, веб-хранилищу , ActiveX , Flash и другим технологиям. HTML5 привел к появлению API файловой системы , но он по большей части не поддерживается за пределами Chrome . С появлением Node.js JavaScript начал завоевывать популярность как законный язык на стороне сервера. На сервере доступ к файловой системе является обычным явлением, что делает мысль об API гораздо менее важной.

Модуль файловой системы

По умолчанию установки Node.js поставляются с модулем файловой системы, fs По большей части fs В следующем примере модуль файловой системы используется для чтения содержимого файла в память. Сначала модуль файловой системы импортируется в строке 1. В строке 3 функция exist exists() Функция обратного вызова exists() Оттуда функция stat() Эта информация важна, поэтому мы знаем, сколько данных нужно прочитать.

Далее мы открываем файл с помощью open() Аргумент r Функция обратного вызова open()дескриптор файла fd Внутри функции обратного вызова мы определяем буфер для хранения содержимого файла. Обратите внимание, что буфер инициализируется по размеру файла, который хранится в stats.size Затем файл читается в буфер с помощью функции read() Буфер теперь содержит необработанные данные, прочитанные из файла. Чтобы отобразить данные, мы должны сначала преобразовать их в строку в кодировке UTF-8. Наконец, содержимое файла выводится на консоль, и файл закрывается.

 var fs = require("fs");
var fileName = "foo.txt";

fs.exists(fileName, function(exists) {
  if (exists) {
    fs.stat(fileName, function(error, stats) {
      fs.open(fileName, "r", function(error, fd) {
        var buffer = new Buffer(stats.size);

        fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
          var data = buffer.toString("utf8", 0, buffer.length);

          console.log(data);
          fs.close(fd);
        });
      });
    });
  }
});

Синхронные функции

Просматривая документацию, вы можете заметить, что многие функции заканчиваются Sync Они представляют синхронные функции – немного редкость в мире Node.js. Синхронные функции предоставляются для удобства. Например, простому пакетному сценарию, написанному на Node.js, вероятно, не нужно беспокоиться о максимизации производительности. Синхронные функции также полезны для загрузки определенных файлов во время инициализации программы. Однако в активном серверном приложении синхронные функции могут серьезно подорвать производительность, останавливая единственный поток выполнения Node.

Следующие примеры показывают, как файл может быть прочитан в память как синхронно, так и асинхронно. Наш предыдущий пример чтения файла немного запутан, если не сказать больше. На этот раз наш пример использует readFile() Первые два аргумента readFile() В соответствии с соглашением Node.js последний аргумент – функция обратного вызова. Аргументы функции обратного вызова предоставляют информацию об ошибке и содержимое файла.

 var fs = require("fs");

fs.readFile("foo.txt", "utf8", function(error, data) {
  console.log(data);
});

В следующем примере та же задача выполняется синхронно с использованием readFileSync() Синхронный код немного более читабелен, но не обладает такой же масштабируемостью, как его асинхронный аналог.

 var fs = require("fs");
var data = fs.readFileSync("foo.txt", "utf8");

console.log(data);

Просмотр файлов

Модуль файловой системы позволяет программам следить за изменениями в конкретных файлах. Это очень полезно в таких программах, как nodemon , который автоматически перезапускает программу при изменении ее исходного кода. В следующем примере просматривается файл с именем «foo.txt». При изменении файла тип события выводится на консоль.

 var fs = require("fs");
var fileName = "foo.txt";

fs.watch(fileName, {
  persistent: true
}, function(event, filename) {
  console.log(event + " event occurred on " + filename);
});

Функция watch() Первый аргумент – это имя файла для просмотра. Второй аргумент является необязательным и предоставляет параметры конфигурации. Если присутствует, вторым аргументом должен быть объект, содержащий логическое значение с именем persistent Если truepersistent Если второй аргумент опущен, по умолчанию он имеет значение true Последний аргумент – это обратный вызов, который срабатывает при изменении целевого файла. Обратный вызов передает тип события (изменение, переименование и т. Д.) И имя файла. Стоит отметить, что watch() Если watch()watchFile()

Вывод

В этой статье был представлен модуль файловой системы Node.js на очень высоком уровне. Модуль содержит более 50 различных функций, что явно слишком для одной статьи. Например, эта статья касалась только чтения файлов и полностью пренебрегала записью в файлы. Я рекомендую вам просмотреть документацию модуля, чтобы получить более глубокое понимание. И помните, синхронные функции должны использоваться с особой осторожностью!