Тестовое задание от Петра Стольникова
- TestTask.cpp — моё решение.
- VFS.cpp — файл для тестов.
File — структура, которая хранит в себе данные о файле.
File имеет 5 полей:
- string fileName — имя файла. Должен содержать хоть 1 символ и не должен содержать символ \ (иначе алгоритмы не будут находить его, потому что этот символ отсекается при парсинге пути). Можно задать через конструктор.
- map<string, File> children — map, который хранит детей файла. Ключ — имя файла, значение — сам файл. Изначально пустой
- string fileContent — содержимое файла. Можно задать через конструктор.
- AccessType accessType — состояние файла в данный момент. Может быть в трёх состояниях:
- READONLY — файл открыт только для чтения;
- WRITEONLY — файл открыт только для записи;
- CLOSED — файл закрыт. Значение по умолчанию.
- mutex * mut — указатель на mutex этого файла. Из-за него файлом одновременно может пользоваться только один поток. Создаётся автоматически.
- File(string name) — создаёт файл с именем name и пустым содержанием.
- File(string name, string content) — создаёт файл с именем name и содержанием content.
MyFS — класс, который имплементирует интерфейс IVFS.
Важно! Все пути в MyFS должны быть в формате "root\файл 1\файл 2..\файл N\искомый файл". Единственное исключение — путь "root", который выдаёт корневой файл.
Важно! В MyFS всё является файлом.
MyFS имеет всего одно поле:
- File root — корневой файл. Создаётся автоматически
- MyFS() — создаёт MyFS и файл root в ней
Принимает путь или часть пути (path) и возвращает имя первого файла из него.
Пример 1 Если мы передадим этому методу путь "file1\file2", то он вернёт нам имя "file1" Пример 2 Если мы передадим этому методу путь "file2", то он вернёт нам имя "file2" Пример 3 Если мы передадим этому методу пустой путь, то он вернёт нам имя "". Это неправильный путь, но с этим разбираются другие методы.
Принимает имя файла (namePart) и
- Возвращает true, если имя файла непустое.
- Возвращает false, если имя файла пустое
Если требования к имени файла изменятся, их легко можно поменять здесь.
Имя файла не может содержать \, почему здесь это не проверяется?. Этот метод заточен под то, чтобы в него передавать результат работы GetNextPartOfPath, а этот метод по определению не может выдать строку с \.
Открывает файл в READONLY режиме. Если нет такого файла или же он открыт во WRITEONLY режиме — возвращает nullptr. Также возвращает nullptr, если
- Имя файла не соответствует правилам
- Путь не соответствует правилам
- Вместо name передали nullptr
Открывает или создаёт файл в WRITEONLY режиме. Если нужно, создаёт все нужные поддиректории, упомянутые в пути. Если файл открыт в READONLY режиме — возвращает nullptr. Также возвращает nullptr, если
- Имя файла не соответствует правилам
- Путь не соответствует правилам
- Вместо name передали nullptr
Читает len символов из файла f и записывает их в буфер buff. Возвращает количество байт, которые реально удалось прочитать.
Записывает len символов из буфера buff в файл f. Возвращает количество байт, которые реально удалось записать.
Переводит файл f в состояние CLOSED.
Пока решал задание, я старался сделать следующее:
- Написать код, который работает;
- Как можно сильнее его отдебажить;
- Очень сильно его прокомментировать. Обычно я комментирую чуть меньше, но тут я действовал с идеей «Лучше я покажу весь ход своих мыслей, чтобы мой код лучше поняли и без живого общения со мной»;
- Через коммиты показать, как я обычно коммичу на проектах;
- Написать документацию. Немного дублирует пункт 3, но лучше излишне прокомментировать свой код, чем недокомментировать его. Поскольку документация небольшая, я не стал под неё заводить целую wiki, а просто описал всё здесь.