В моей операционной системе есть файловая система, и когда я создаю файл с помощью команды: <br/> <code>mkfile filename data</code>, всё работает корректно. Однако, после выполнения команды <br/> <code>tree</code>, которая отображает дерево файлов на диске и показывает <br/> <code>|-- filename</code>, если я повторно выполню команду <code>tree</code> 2-4 раза, то название файла изменяется на "tree" (или "dir", если использовать последнюю). Почему это происходит? Приношу свои извинения за большое количество кода, но я не уверен, где может быть ошибка. <br/> <br/> fs.h: <br/> <pre><code class="cpp">#pragma once #ifndef _FS_ #define _FS_ #include "libs/vector/vector.h" #include "libs/map/map.h" #include "utils/typedef.h" #include "libs/string/class.h" #define _INVALID_SECTOR -1 namespace SimpleOS { class FileSystem { public: struct File { size_t size = 0; vector<uint32_t> sectors; }; struct Directory { map<string, File> files; map<string, Directory> directories; Directory* parent = nullptr; }; static bool create_file(const string& name, const string& data = nullptr); static bool delete_file(const string& name); static bool write_to_file(const string& name, const string& data); static bool append_to_file(const string& name, const string& data); static bool read_file(const string& name, string& buffer); static bool format(); static void file_info(const string& name); static bool file_exist(const string& name); static bool dir_exist(const string& name); static bool __check_exist(const string& name); static bool __check_dir_exist(const string& name); static bool create_dir(const string& name); static bool delete_dir(const string& name); static bo
Ваш вопрос указывает на потенциальную проблему в реализации файловой системы, связанной с особенностями хранения имен файлов. Ниже приведены возможные причины, по которым название вашего файла может изменяться автоматически, и подходы к исправлению этой проблемы: ### Возможные причины проблемы 1. **Конфликт имен файлов**: Если при создании файла или директории происходит конфликт с именами, которые уже используются в файловой системе (например, `tree` или `dir`), это может привести к неправильному отображению имен файлов. Убедитесь, что имена, которые вы создаете, уникальны в пределах текущего каталога. 2. **Изменения в структуре данных**: Проверьте, корректно ли вы обновляете структуры данных при создании и отображении файлов. Например, при добавлении нового файла в `map<string, File>` у вас может случайно произойти перезапись существующего файла с аналогичным именем. 3. **Ошибки в функции `create_file`**: Если метод `create_file` не проверяет существование файла перед его созданием, это может привести к перезаписи существующих файлов. Убедитесь, что эта функция проверяет существование файла перед его добавлением в файловую систему. 4. **Обращение к памяти**: Если у вас есть ошибки, связанные с управлением памятью, такие как утечки памяти или запись за пределами выделенной области, это может вызывать неожиданное поведение, включая случайное изменение имен файлов. ### Предлагаемые действия 1. **Проверка уникальности имен**: В `create_file` убедитесь, что перед добавлением нового файла вы проверяете, существует ли уже файл с таким именем: ```cpp static bool create_file(const string& name, const string& data = nullptr) { if (__check_exist(name)) { std::cerr << "Error: file already exists." << std::endl; return false; } // Логика создания файла... } ``` 2. **Логгирование изменений**: Введите логгирование действий, чтобы отслеживать создание и изменение файлов. Это может помочь вам определить, когда происходит изменение имени. 3. **Тестирование кода**: Напишите тесты, чтобы проверить работу всех функций, работающих с файлами и директориями. Убедитесь, что они работают правильно на разных сценариях и при различных вводах. 4. **Проверка доступа к структурам данных**: Убедитесь, что при доступе к элементам `map` вы используете правильный способ доступа, чтобы избежать непреднамеренного изменения данных. 5. **Обработка ошибок**: Убедитесь, что все функции обрабатывают ошибки корректно, особенно при обращении к структурам данных. Эти меры могут помочь вам выявить и исправить ошибку, связанную с изменением имени файла в вашей файловой системе.
Проблема, как я вижу, зарыта в реализации методаmap::copy
, вот в этом месте . Нельзя копировать сложные объекты функциейmemcpy()
, потому что при удалении копии её деструктор освободит данные оригинала. Для такого копирования следует либо использовать placement new, либо копировать целиком объект Node, типа того . Для того чтобы это работало потребуется реализовать глобальный оператор new, типа того . С этими изменениями конкретно описанная в топике проблема решается, но я вижу, что и другие методы классаmap
реализованы с похожими ошибками, так что не расслабляйся и не думай, что это была единственная проблема в коде.
Отдельный вопрос: зачемFileSystem::get_root()
копирует всё дерево файловой системы, когдаFileSystem::tree()
явно не собирается его менять, можно было бы в этом случае обойтись константной ссылкой.