У нас уже есть библиотека для работы с деревьями. Поэтому можно создать библиотеку для работы с файловой системой.
Начнем с тестов и попробуем определить дизайн нашей библиотеки. Для начала создадим instance — новую файловую систему. Сделаем это через new
. И у нас появляется const files
:
Для начала убеждаемся, что у нас не существует директории внутри файловой системы, например, etc
. При этом у нас получается интерфейс files.isDirectory
.
После этого мы создаем эту директорию с помощью функции mkdirSync
. И делаем проверку, которая была выше. Только сейчас она должна вернуть истину — сказать, что директория была создана:
Далее мы создаем внутреннюю директорию и убеждаемся, что она есть:
Сейчас тестов недостаточно, обычно необходимо больше. Но для начала этого хватит. Здесь видно характер интерфейса, который мы закладываем в эту библиотеку.
Команда mkdir
, которая используется в консоли, не создает директорию рекурсивно по умолчанию. То есть эта команда создает только директорию следующего уровня. Если передать ей на вход путь, который в себе содержит несколько несуществующих вложенных директорий, то они не будут созданы. Это одна из ошибочных ситуаций.
Мы используем библиотеку, чтобы хранить деревья и работать с ними. Поэтому нам необходимо при создании записать в this tree
новое дерево и передать туда слэш как корень:
При этом когда мы создаем новый узел, например, используем mkdir
, то добавляем в дерево ребенка. В нем первым параметром идет имя — name
, а вторым — мета как дополнительная информация. Последнее нужно, так как у нас универсальная библиотека работы с деревьями. Например, мы можем передать тип:
То есть мы должны определять директорию этой лифайла, так как hexlet trees внутри не ассоциирована с файловой системой. Поэтому без этого мы не сможем понять, с чем мы работаем.
Разберем типичный порядок действий при работе с нашей библиотекой. Рассмотрим это на примере mkdir
.
Сначала у нас есть некий путь, который мы хотим создать:
mkdir
создает только вложенные директории, но на один уровень ниже. То есть мы не можем создать несколько директорий в глубину. Путь из примера может быть создан только при условии, что папки etc
и nginx
уже существуют. А нам нужно создать папку conf.d
.
Порядок действий будет таким:
getDeepChild
извлекаем предпоследний элемент — достаем nginx
nginx
нового ребенка — conf.d
Таким образом работает mkdir
и большинство других функций в работе с файловой системой.
Есть некоторые особенности, которые касаются реальных файловых систем и того, как с ними работает API.
Мы используем слэши, чтобы отделять директории друг от друга. Подряд идущие слэши не влияют на глубину. Внутри API происходит нормализация, и дублирующиеся слэши убираются.
Например, мы создали такую директорию:
В этом случае конечный слэш ни на что не влияет. Сама команда определяет, что это директория. Например, мы проверяем, что является для директории /var
или /var////
:
В этом случае внутри происходит нормализация — слэши они убираются и считается, что все хорошо.
Еще один пример, где создана директория с большим количеством слэшей:
Делаем проверку /var/log
, и она говорит, что директория создана.
Получается, что нормализация происходит на всех уровнях. Это важный аспект, который делает задачу интересней, и его нужно соблюдать.
touch
Команда touch
тоже часто используется в файловых системах. Она изменяет время доступа к файлу. Также она дополнительно создает файл. Но так как она короткая и удобная, то обычно используют ее, когда создают пустые файлы.
При этом это не первостепенная задача команды touch
. Но так как это можно делать, разработчики пользуются ею.
Как это работает:
touch
:Внутри записывается тип — файл. Потом это будет нужно при проверках
Здесь важно помнить, что если мы передаем слэши, то они должны автоматически убираться — пути должны нормализовываться внутри.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт