-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathos_file.h
149 lines (128 loc) · 13.1 KB
/
os_file.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdlib.h>
#include <memory.h>
struct Folder;
struct File;
// Файловый менеждер осуществляет операции с файлами и директориями.
// Оперирует с виртуальным деревом каталогов и файлов, каждый файл или директория имеют имя,
// состоящее из латинских прописных и заглавных букв, цифр и символов '_' и '.'. Длина имени
// ограничена 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
// Возвращаемое значение: количество найденных файлов - успех, -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);