3. Виртуальная файловая система
Познакомиться с библиотекой, умеющей создавать файлы в памяти
В этом курсе мы создадим виртуальную (не настоящую) файловую систему и реализуем повседневные операции для работы с ней: подсчёт свободного места, поиск файлов и директорий и т.п. Вот как выглядит создание этого дерева:
import { mkdir, mkfile } from '@hexlet/immutable-fs-trees'; // mkdir вторым параметром принимает список детей, // которые могут быть либо директориями, созданными mkdir, // либо файлами, созданными mkfile const tree = mkdir('etc', [ mkfile('bashrc'), mkdir('consul', [ mkfile('config.json'), ]), ]);
В результате получается такая структура:
etc ├── bashrc └── consul └── config.json
Вкладывая вызовы mkdir()
и mkfile()
друг в друга, можно получить любую файловую структуру. Корнем в этой структуре будет директория, а в листьях могут оказаться как файлы, так и пустые директории.
Эта структура виртуальная, то есть реального создания файлов и директорий не происходит. Вся информация о файловой системе находится в переменной 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
— объект с произвольными данными, например, размером, датой создания и так далее. Свойства задаются во время создания узлов:
mkfile('.bashrc', { size: 75 }); mkdir('hexlet', [/* дети */], { owner: 'nobody' });
Метаданные понадобятся функциям, которые анализируют дерево, например считают занятое место.
Дополнительные материалы
Тесты
Вопрос 1
По какому признаку правильно определять является ли узел директорией?
По наличию свойства children
По имени. У имен нет расширений.
По типу
Вопрос 2
Чем является узел в представленном дереве?
Строкой
Массивом
Объектом
Вопрос 3
Может ли узел с типом file содержать внутри себя children?
Файл это листовой узел, а значит у него не может быть детей
Может. Любой узел может содержать внутри себя другие узлы
Вопрос 4
Какой тип данных хранится в свойстве children
?
Массив
Объект
Функция
Упражнение
generator.js
Реализуйте и экспортируйте по умолчанию функцию, которая создает такую файловую систему:
# Обратите внимание на метаданные nodejs-package # директория (метаданные: { hidden: true }) ├── Makefile # файл ├── README.md # файл ├── dist # пустая директория ├── __tests__ # директория │ └── half.test.js # файл (метаданные: { type: 'text/javascript' }) ├── babel.config.js # файл (метаданные: { type: 'text/javascript' }) └── node_modules # директория (метаданные: { owner: 'root', hidden: false }) └── @babel # директория └── cli # директория └── LICENSE # файл
generator.js
// @ts-check import { mkdir, mkfile } from '@hexlet/immutable-fs-trees'; // BEGIN (write your solution here) // END
Хештеги