В моей операционной системе есть файловая система, и когда я создаю файл с помощью команды: <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()явно не собирается его менять, можно было бы в этом случае обойтись константной ссылкой.