Почему у меня в операционной системе название файла изменяется автоматически?

В моей операционной системе есть файловая система, и когда я создаю файл с помощью команды: <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&lt;uint32_t&gt; sectors;

};

struct Directory {
map&lt;string, File&gt; files;
map&lt;string, Directory&gt; directories;
Directory* parent = nullptr;
};

static bool create_file(const string&amp; name, const string&amp; data = nullptr);

static bool delete_file(const string&amp; name);

static bool write_to_file(const string&amp; name, const string&amp; data);

static bool append_to_file(const string&amp; name, const string&amp; data);

static bool read_file(const string&amp; name, string&amp; buffer);

static bool format();

static void file_info(const string&amp; name);

static bool file_exist(const string&amp; name);
static bool dir_exist(const string&amp; name);

static bool __check_exist(const string&amp; name);
static bool __check_dir_exist(const string&amp; name);

static bool create_dir(const string&amp; name);

static bool delete_dir(const string&amp; name);

static bo
  • 11 октября 2024 г. 7:15
Ответы на вопрос 2
Ваш вопрос указывает на потенциальную проблему в реализации файловой системы, связанной с особенностями хранения имен файлов. Ниже приведены возможные причины, по которым название вашего файла может изменяться автоматически, и подходы к исправлению этой проблемы:

### Возможные причины проблемы

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() явно не собирается его менять, можно было бы в этом случае обойтись константной ссылкой.
Похожие вопросы