Giter VIP home page Giter VIP logo

vfs's Introduction

VFS

Тестовое задание от Петра Стольникова

Структура файлов

  • TestTask.cpp — моё решение.
  • VFS.cpp — файл для тестов.

File

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

MyFS — класс, который имплементирует интерфейс IVFS.

Важно! Все пути в MyFS должны быть в формате "root\файл 1\файл 2..\файл N\искомый файл". Единственное исключение — путь "root", который выдаёт корневой файл.

Важно! В MyFS всё является файлом.

Поля

MyFS имеет всего одно поле:

  • File root — корневой файл. Создаётся автоматически

Конструкторы

  • MyFS() — создаёт MyFS и файл root в ней

Методы

string GetNextPartOfPath(string path)

Принимает путь или часть пути (path) и возвращает имя первого файла из него.

Пример 1 Если мы передадим этому методу путь "file1\file2", то он вернёт нам имя "file1" Пример 2 Если мы передадим этому методу путь "file2", то он вернёт нам имя "file2" Пример 3 Если мы передадим этому методу пустой путь, то он вернёт нам имя "". Это неправильный путь, но с этим разбираются другие методы.

bool FileNameIsValid(string namePart)

Принимает имя файла (namePart) и

  • Возвращает true, если имя файла непустое.
  • Возвращает false, если имя файла пустое

Если требования к имени файла изменятся, их легко можно поменять здесь.

Имя файла не может содержать \, почему здесь это не проверяется?. Этот метод заточен под то, чтобы в него передавать результат работы GetNextPartOfPath, а этот метод по определению не может выдать строку с \.

File* Open(const char* name)

Открывает файл в READONLY режиме. Если нет такого файла или же он открыт во WRITEONLY режиме — возвращает nullptr. Также возвращает nullptr, если

  • Имя файла не соответствует правилам
  • Путь не соответствует правилам
  • Вместо name передали nullptr

File* Create(const char* name)

Открывает или создаёт файл в WRITEONLY режиме. Если нужно, создаёт все нужные поддиректории, упомянутые в пути. Если файл открыт в READONLY режиме — возвращает nullptr. Также возвращает nullptr, если

  • Имя файла не соответствует правилам
  • Путь не соответствует правилам
  • Вместо name передали nullptr

size_t Read(File* f, char* buff, size_t len)

Читает len символов из файла f и записывает их в буфер buff. Возвращает количество байт, которые реально удалось прочитать.

size_t Write(File* f, char* buff, size_t len)

Записывает len символов из буфера buff в файл f. Возвращает количество байт, которые реально удалось записать.

void Close(File* f)

Переводит файл f в состояние CLOSED.

Немного о том, как я выполнял задание

Пока решал задание, я старался сделать следующее:

  1. Написать код, который работает;
  2. Как можно сильнее его отдебажить;
  3. Очень сильно его прокомментировать. Обычно я комментирую чуть меньше, но тут я действовал с идеей «Лучше я покажу весь ход своих мыслей, чтобы мой код лучше поняли и без живого общения со мной»;
  4. Через коммиты показать, как я обычно коммичу на проектах;
  5. Написать документацию. Немного дублирует пункт 3, но лучше излишне прокомментировать свой код, чем недокомментировать его. Поскольку документация небольшая, я не стал под неё заводить целую wiki, а просто описал всё здесь.

vfs's People

Contributors

dumbshrimp1740 avatar dumbshrimp avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.