Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Файловая система JS: Обработка ошибок

У нас уже есть библиотека для работы с деревьями. Поэтому можно создать библиотеку для работы с файловой системой.

TDD

Начнем с тестов и попробуем определить дизайн нашей библиотеки. Для начала создадим instance — новую файловую систему. Сделаем это через new. И у нас появляется const files:

Для начала убеждаемся, что у нас не существует директории внутри файловой системы, например, etc. При этом у нас получается интерфейс files.isDirectory.

После этого мы создаем эту директорию с помощью функции mkdirSync. И делаем проверку, которая была выше. Только сейчас она должна вернуть истину — сказать, что директория была создана:

Далее мы создаем внутреннюю директорию и убеждаемся, что она есть:

Сейчас тестов недостаточно, обычно необходимо больше. Но для начала этого хватит. Здесь видно характер интерфейса, который мы закладываем в эту библиотеку.

Команда mkdir, которая используется в консоли, не создает директорию рекурсивно по умолчанию. То есть эта команда создает только директорию следующего уровня. Если передать ей на вход путь, который в себе содержит несколько несуществующих вложенных директорий, то они не будут созданы. Это одна из ошибочных ситуаций.

Как внутри выглядит модуль

Мы используем библиотеку, чтобы хранить деревья и работать с ними. Поэтому нам необходимо при создании записать в this tree новое дерево и передать туда слэш как корень:

При этом когда мы создаем новый узел, например, используем mkdir, то добавляем в дерево ребенка. В нем первым параметром идет имя — name, а вторым — мета как дополнительная информация. Последнее нужно, так как у нас универсальная библиотека работы с деревьями. Например, мы можем передать тип:

То есть мы должны определять директорию этой лифайла, так как hexlet trees внутри не ассоциирована с файловой системой. Поэтому без этого мы не сможем понять, с чем мы работаем.

Типичный порядок действий при работе с библиотекой

Разберем типичный порядок действий при работе с нашей библиотекой. Рассмотрим это на примере mkdir.

Сначала у нас есть некий путь, который мы хотим создать:

mkdir создает только вложенные директории, но на один уровень ниже. То есть мы не можем создать несколько директорий в глубину. Путь из примера может быть создан только при условии, что папки etc и nginx уже существуют. А нам нужно создать папку conf.d.

Порядок действий будет таким:

  1. Разбиваем путь на массив имен
  2. С помощью getDeepChild извлекаем предпоследний элемент — достаем nginx
  3. Добавляем nginx нового ребенка — conf.d

Таким образом работает mkdir и большинство других функций в работе с файловой системой.

Особенности работы путей

Есть некоторые особенности, которые касаются реальных файловых систем и того, как с ними работает API.

Мы используем слэши, чтобы отделять директории друг от друга. Подряд идущие слэши не влияют на глубину. Внутри API происходит нормализация, и дублирующиеся слэши убираются.

Например, мы создали такую директорию:

В этом случае конечный слэш ни на что не влияет. Сама команда определяет, что это директория. Например, мы проверяем, что является для директории /var или /var////:

В этом случае внутри происходит нормализация — слэши они убираются и считается, что все хорошо.

Еще один пример, где создана директория с большим количеством слэшей:

Делаем проверку /var/log, и она говорит, что директория создана.

Получается, что нормализация происходит на всех уровнях. Это важный аспект, который делает задачу интересней, и его нужно соблюдать.

touch

Команда touch тоже часто используется в файловых системах. Она изменяет время доступа к файлу. Также она дополнительно создает файл. Но так как она короткая и удобная, то обычно используют ее, когда создают пустые файлы.

При этом это не первостепенная задача команды touch. Но так как это можно делать, разработчики пользуются ею.

Как это работает:

  1. Проверяем, что файл не существует — убеждаемся, что эта функция правильно работает:
  1. Делаем touch:

Внутри записывается тип — файл. Потом это будет нужно при проверках

  1. Проверяем, что он существует:

Здесь важно помнить, что если мы передаем слэши, то они должны автоматически убираться — пути должны нормализовываться внутри.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»