добавил файл с контеста

This commit is contained in:
weier committed 2026-10-07 10:23:45 +05:00
1 parent 5dc390305c
commit 83e209cb89
6 files changed
+185

No files matched your search

+1
View File
@@ -0,0 +1 @@
.vs/
BIN
View File
Binary file not shown.
+148
View File
@@ -0,0 +1,148 @@
#include <stdlib.h>
#include <memory.h>
// Файловый менеждер осуществляет операции с файлами и директориями.
// Оперирует с виртуальным деревом каталогов и файлов, каждый файл или директория имеют имя,
// состоящее из латинских прописных и заглавных букв, цифр и символов '_' и '.'. Длина имени
// ограничена 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);
+36
View File
@@ -0,0 +1,36 @@
#include <stdio.h>
#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;
}
File renamed without changes.