В этом уроке мы создадим виртуальную (не настоящую) файловую систему и реализуем повседневные операции для работы с ней: подсчет свободного места, поиск файлов и директорий и другие.
Эта файловая система не имеет практического применения, на ней мы будем практиковать навыки работы с древовидными структурами данных.
Как работать с файловой системой
Обработка любых деревьев в сущности не отличается. Файловая система, каталоги товаров, адреса, родственные связи и многое другое — все эти данные можно представить в виде дерева. Подход в работе с каждым типом будет один и тот же. Научившись работать с одним деревом, вы сможете применять эти же знания в работе с другими деревьями.
Вот как выглядит создание дерева виртуальной файловой системы:
from hexlet import fs
# Вторым параметром mkdir принимает список потомков,
# которые могут быть либо созданными mkdir директориями, либо созданными mkfile файлами
tree = fs.mkdir(
"etc",
[
fs.mkfile("bashrc"),
fs.mkdir(
"consul",
[
fs.mkfile("config.json"),
],
),
],
)
В результате получается такая структура:
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": "dir_name",
"type": "directory",
"meta": {}, # Свойства директории
"children": [], # Здесь хранятся потомки
}
А теперь изучим представление файла:
{
"name": "file_name",
"type": "file",
"meta": {}, # Свойства файла
}
У файлов и директорий есть имена — это общая часть. Свойство type
определяет тип узла. С его помощью во время обработки этого дерева можно понять, что именно находится перед нами. Еще есть свойство meta
— это словарь с произвольными данными, например, размером, или датой создания.
Свойства задаются во время создания узлов:
mkfile(".bashrc", {"size": 75})
mkdir("hexlet", [], {"owner": "nobody"})
Метаданные понадобятся функциям, которые анализируют дерево — например, считают занятое место.
Дополнительные материалы

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.