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 4692560..ede7e13 100644 Binary files a/.vs/file-manager/CopilotIndices/18.9.1329.3188/SemanticSymbols.db-wal and b/.vs/file-manager/CopilotIndices/18.9.1329.3188/SemanticSymbols.db-wal differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 3e70270..ef40ebf 100644 Binary files a/.vs/slnx.sqlite and b/.vs/slnx.sqlite differ diff --git a/os_file (2).h b/os_file (2).h new file mode 100644 index 0000000..889d39c --- /dev/null +++ b/os_file (2).h @@ -0,0 +1,148 @@ +#include +#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)