В этом курсе мы создадим виртуальную (не настоящую) файловую систему и реализуем повседневные операции для работы с ней: подсчет свободного места, поиск файлов и директорий и другие. Эта файловая система не имеет практического применения, на ней мы будем обкатывать навыки работы с древовидными структурами данных. Обработка любых деревьев в сущности не отличается. Файловая система, каталоги товаров, адреса, родственные связи и многое другое — все эти данные можно представить в виде дерева. Подход в работе с каждым типом будет один и тот же. Научившись работать с одним деревом, вы сможете применять эти же знания в работе с другими деревьями.
Вот как выглядит создание дерева виртуальной файловой системы:
import * as fsTrees from '@hexlet/immutable-fs-trees';
// mkdir вторым параметром принимает список детей,
// которые могут быть либо директориями, созданными mkdir,
// либо файлами, созданными mkfile
const tree = fsTrees.mkdir('etc', [
fsTrees.mkfile('bashrc'),
fsTrees.mkdir('consul', [
fsTrees.mkfile('config.json'),
]),
]);
Первым параметром в функции mkdir()
и mkfile()
передается имя создаваемой директории или файла. Вторым параметром функция mkdir()
принимает список вложенных в нее файлов и директорий. Последним параметром обе функции принимают метаданные meta
, о которых мы поговорим чуть позже.
В результате получается такая структура:
etc
├── bashrc
└── consul
└── config.json
Вкладывая вызовы mkdir
и mkfile
в другие mkdir
, можно получить любую файловую структуру. Корнем в этой структуре будет директория, а в листьях могут оказаться как файлы, так и пустые директории.
Эта структура виртуальная, то есть реального создания файлов и директорий не происходит. Вся информация о файловой системе находится в переменной tree
. Если ее распечатать на экран, то мы увидим следующее содержимое:
{
name: 'etc',
type: 'directory',
meta: {},
children: [
{
name: 'bashrc',
type: 'file',
meta: {},
},
{
name: 'consul',
type: 'directory',
meta: {},
children: [
{
name: 'config.json',
type: 'file',
meta: {},
}
],
},
],
};
Это внутренняя реализация файлового дерева. Она состоит из двух типов узлов: директорий и файлов.
Представление директории:
{
name: /* ... */,
type: 'directory',
meta: {}, // Свойства директории
children: [/* ... */], // Здесь хранятся дети
}
Представление файла:
{
name: /* ... */,
type: 'file',
meta: {}, // Свойства файла
}
У файлов и директорий есть имена, это общая часть. Свойство type
определяет тип узла и с его помощью можно понять, что перед нами во время обработки этого дерева. meta
— объект с произвольными данными, например, размером, датой создания и так далее. Свойства задаются во время создания узлов:
fsTrees.mkfile('.bashrc', { size: 75 });
fsTrees.mkdir('hexlet', [/* дети */], { owner: 'nobody' });
Метаданные понадобятся функциям, которые анализируют дерево, например считают занятое место.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.