добавил файл с контеста
This commit is contained in:
1 parent
5dc390305c
commit
83e209cb89
6 files changed
+185
No files matched your search
@@ -0,0 +1 @@
|
||||
.vs/
|
||||
Binary file not shown.
Binary file not shown.
+148
@@ -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);
|
||||
@@ -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.
Reference in new issue
Block a user