From 83e209cb8952328c7d6ff2fd15fac34df8a34d59 Mon Sep 17 00:00:00 2001 From: weier Date: Wed, 7 Oct 2026 10:23:45 +0500 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../18.9.1329.3188/SemanticSymbols.db-wal | Bin 65952 -> 276072 bytes .vs/slnx.sqlite | Bin 90112 -> 90112 bytes os_file (2).h | 148 ++++++++++++++++++ os_file_test (2).cpp | 36 +++++ Новый файл => Новый файл (2) | 0 6 files changed, 185 insertions(+) create mode 100644 .gitignore create mode 100644 os_file (2).h create mode 100644 os_file_test (2).cpp rename Новый файл => Новый файл (2) (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a4d6d9c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vs/ \ No newline at end of file diff --git a/.vs/file-manager/CopilotIndices/18.9.1329.3188/SemanticSymbols.db-wal b/.vs/file-manager/CopilotIndices/18.9.1329.3188/SemanticSymbols.db-wal index 469256062e0ec873ab01b94ba6f0bdfef1ba235c..ede7e138e1b165ea578d5bd15fb2d26aac6203fa 100644 GIT binary patch delta 6650 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 delta 432 zcmZoTz}j$tb%Hdb*hCp;MzM_v%lJ9k8TeoD&gX64*jULcF2>BlpwI7_my%i$P?VpX zT3qa$Uz%64d7f+<69*IjB?kUW{I50(E;z +#include + +// Файловый менеждер осуществляет операции с файлами и директориями. +// Оперирует с виртуальным деревом каталогов и файлов, каждый файл или директория имеют имя, +// состоящее из латинских прописных и заглавных букв, цифр и символов '_' и '.'. Длина имени +// ограничена 32 символами. При этом длина полного абсолютного пути каждого файла или директории +// ограничена 128 символами. Файлы имеют некоторый ненулевой размер (в байтах). +// Считаем, что директории размера не имеют, и их можно создавать в любом количестве. +// Корневая директория '/' создается автоматически и не может быть удалена. +// Для идентификации файла или директории используется путь, состоящий из имен вложенных директорий, +// содержащих данный файл, и знаков '/', например /dir1/dir2/file.txt. +// Любой файл или директория доступны по относительным и абсолютным путям. Относительный путь +// считается относительно текущей директории, абсолютный путь начинается с корневой директории, т.е. +// '/', например /my_dir1/my_dir2/file.txt и my_dir2/file.txt указывают на один и тот же файл при +// условии, что /my_dir1 - текущая директория. +// При создании файлового менеджера корневая директория устанавливается текущей. +// Кроме имен директорий в пути могут присутствовать две специальные директории '.' и '..', первая из +// которых обозначает, что путь не меняется, а вторая означает, что путь должен пройти на директорию +// вверх, например /my_dir1/my_dir2/file.txt и ../my_dir2/file.txt являются одинаковыми при условии, +// что текущая директория имеет вид /my_dir1/my_dir3. +// В связи с этим запрещается создавать файлы или директории с именами . и .. (менеджер должен выдавать +// ошибку в случае попытки создать такой файл или директорию). +// При удалении или перемещении текущей директории корень становится текущей директорией +typedef struct +{ + // Создание файлового менеджера, + // disk_size - размер диска + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*create)(int disk_size); + + // Удаление файлового менеджера + // Структура директорий, созданная на данный момент полностью удаляется + // Возвращаемое значение: 1 - успех, 0 - неудача (например, менеждер не был создан) + int (*destroy)(); + + // Создает директорию с указанным именем. + // В качестве аргумента принимает абсолютный или относительный путь + // Создание директории возможно только внутри уже существующей директории + // Возвращаемое значение: 1 - успех, 0 - неудача (например, менеждер не был создан) + int (*create_dir)(const char* path); + + // Создает файл с указанным именем и размером. + // В качестве аргумента принимает абсолютный или относительный путь + // Создание файла возможно только внутри уже существующей директории + // Возвращаемое значение: 1 - успех, 0 - неудача (например, не хватило места) + int (*create_file)(const char* path, int file_size); + + // Удаляет файл или директорию с указанным именем. + // В качестве аргумента принимает абсолютный или относительный путь + // Если указана непустая директория и флаг recursive равен 0, то директория не удаляется и выдается ошибка. + // Если указана директория и флаг recursive равен 1, то директория удаляется вместе со всем ее содержимым. + // Если получилось так, что текущая директория была удалена - текущей становится корневая директория. + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*remove)(const char* path, int recursive); + + // Меняет текущую директорию + // В качестве аргумента принимает абсолютный или относительный путь новой текущей директории + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*change_dir)(const char* path); + + // Возвращает полный путь текущей директории (кладет в буфер dst) + void (*get_cur_dir)(char *dst); + + // Проверяет существование файла или директории. + // В качестве аргумента принимает абсолютный или относительный путь + // Возвращаемое значение: 1 - файл или директория существует, 0 - нет + int (*exists)(const char* path); + + // Проверяет, является ли указанное имя файлом + // Возвращаемое значение: 1 - файл, 0 - директория или нет такого пути + int (*is_file)(const char* path); + + // Проверяет, является ли указанное имя файлом + // Возвращаемое значение: 1 - директория, 0 - файл или нет такого пути + int (*is_dir)(const char* path); + + // Для директорий выводит на экран содержимое директорий, + // Для файлов - их путь (в том виде, в каком он подан на вход функции). + // формат вывода директорий: + // <путь к директории>: <содержимое директории в алфавитном порядке> + // здесь путь к директории - в точности тот путь, что был подан на вход функции. + // Если установлен флаг dir_first, то сначала выводит все поддиректории, + // а потом файлы. + // При выводе содержимого нескольких директорий или имен нескольких файлов с помощью + // входного шаблона * выводит их в алфавитном порядке. + // Если хотя бы один файл или директория из списка или шабона * не существует, + // функция возвращает 0, но при этом для остальных (существующих) файлов или директорий + // содержимое выводится на экран + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*list)(const char* path, int dir_first); + + // Выводит на экран содержимое директории и всех поддиректорий. Обход дерева - в глубину, т.е. сначала выводится + // содержимое верхней директории, потом содержимое первой поддиректории, потом содержимое первой поддиректории в ней + // и т.д., когда доходим до директории, в которой больше нет поддиректорий, переходим к следующей (по алфавиту) + // директории на этом же уровне и т.д. + // Пример последовательности обхода директорий: + // / + // /a + // /a/1 + // /b + // /b/1 + // /b/1/1 + // /b/a + // /с + // Формат вывода для каждой из обходимых директорий: + // <путь к директории>: <содержимое директории в алфавитном порядке> + // Внутри каждой директории поддиректории обходятся и выводятся в алфавитном порядке. + // Если указан флаг dir_first, сначала выводятся директории, а потом файлы. + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*list_recursive)(const char* path, int dir_first); + + // Поиск файла или директории с указанным именем name в указанной директории path (и всех ее поддиректориях). + // Выводит на экран все найденные файлы и директории с данным именем. + // Обход производится аналогично функции list_recursive + // Пути к найденном файлу начинается с пути, поданного в качестве аргумента path, + // т.е. заменять на абсолютный путь не нужно. + // Возвращаемое значение: количество найденных файлов - успех, -1 - неудача (неверный путь) + int (*find)(const char *path, const char *name); + + // Перемещает (переименовывает) файл или директорию. + // При попытке переместить файл или каталог в самого себя должен выдавать ошибку. + // При попытке переименовать/переместить файл или каталог в существующий файл или каталог выдается ошибка. + // Если получилось так, что текущая директория была перемещена, - текущей становится корневая директория + // Возвращаемое значение: 1 - успех, 0 - неудача + int (*move)(const char *old_path, const char *new_path); + + // Копирует файл или директорию в другое место. + // При попытке скопировать файл или каталог в самого себя должен выдавать ошибку (-1) + // При попытке скопировать в файл или несуществующую директорию выдавать ошибку + // Возвращаемое значение: количество скопированных файлов - успех, -1 - неудача + int (*copy)(const char *path, const char *to_path); + + // Вычисляет свободное пространство на диске в байтах + int (*free_space)(); + + // Подсчитывает размер директории или файла. + // Размер директории - суммарный размер всех файлов в этой директории (в том числе и во вложенных поддиректориях) + // Возвращаемое значение: размер файла или директории в байтах - успех, -1 - неудача + int (*size)(const char *path); + + // Подсчитывает количество файлов в директории (в том числе и во вложенных поддиректориях) + // Возвращаемое значение: количество файлов - успех, -1 - неудача + int (*files_count)(const char *path); + +} file_manager_t; + +void setup_file_manager(file_manager_t *fm); diff --git a/os_file_test (2).cpp b/os_file_test (2).cpp new file mode 100644 index 0000000..222538a --- /dev/null +++ b/os_file_test (2).cpp @@ -0,0 +1,36 @@ +#include +#include "os_file.h" + +//************************************************ +int my_create(int disk_size) +{ + return 1; +} + +//************************************************ +int my_destroy() +{ + return 1; +} + +void my_get_cur_dir(char* dst) { + strcpy(dst, "test"); +} + +void setup_file_manager(file_manager_t *fm) { + fm->create = my_create; + fm->destroy = my_destroy; + fm->get_cur_dir = my_get_cur_dir; +} + +//************************************************ +//************************************************ +int main() +{ + file_manager_t fm; + + setup_file_manager(&fm); + int result = fm.create(10); + result = fm.destroy(); + return 0; +} diff --git a/Новый файл b/Новый файл (2) similarity index 100% rename from Новый файл rename to Новый файл (2)