-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathFileSystem.hpp
More file actions
146 lines (125 loc) · 7.18 KB
/
FileSystem.hpp
File metadata and controls
146 lines (125 loc) · 7.18 KB
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
#ifndef ___INANITY_FILE_SYSTEM_HPP___
#define ___INANITY_FILE_SYSTEM_HPP___
#include "Object.hpp"
#include "String.hpp"
#include "meta/decl.hpp"
#include <vector>
#include <ctime>
BEGIN_INANITY
/*
Файл содержит абстрактный класс файловой системы.
Методы LoadFile и TryLoadFile отличаются только тем, что
TryLoadFile может выдавать нулевую ссылку (при отсутствии файла),
а LoadFile бросает в таком случае исключение.
*/
class File;
class Storage;
class InputStream;
class OutputStream;
/// Абстрактный класс файловой системы.
/** Файловая система - это набор файлов, к которым можно обращаться по именам.
Файловая система не гарантирует постоянство этого набора.
Для реализации необходимо определить хотя бы один из методов LoadFile или TryLoadFile.
В случае неопределенности одного из методов, реализация по умолчанию реализует его
через другой метод. Можно реализовывать оба метода, если это более эффективно в данной
файловой системе. Реализация TryLoadFile по умолчанию работает с некоторой потерей в
производительности (за счет перехвата исключений из LoadFile). Реализация LoadFile
вполне эффективна (так как перехват исключений не требуется). Поэтому рекомендуется
реализовывать хотя бы TryLoadFile.
Для реализации также можно определить методы LoadStream и SaveStream.
Реализация LoadStream по умолчанию использует метод LoadFile вместе с классом
MemoryStream. Реализация SaveStream только бросает исключение.
В качестве разделителя каталогов используется прямой слеш /.
Путь должен начинаться со слеша.
Имя каталога должно заканчиваться слешем.
*/
class FileSystem : public Object
{
public:
enum EntryType
{
entryTypeMissing,
entryTypeFile,
entryTypeDirectory,
entryTypeOther
};
/// Загрузить файл.
/** Возвращает объект File для заданного файла. При отсутствии файла
с заданным именем выбрасывает исключение.
\param fileName Имя файла в данной файловой системе.
\return Объект File для заданного файла.
*/
virtual ptr<File> LoadFile(const String& fileName);
/// Загрузить файл.
/** Возвращает объект File для заданного файла. При отсутствии файла
с заданным именем возвращает null.
\param fileName Имя файла в данной файловой системе.
\return Объект File для заданного файла, или null, если файл не
удалось загрузить.
*/
virtual ptr<File> TryLoadFile(const String& fileName);
/// Load file as storage.
/** Default implementation uses LoadFile. */
virtual ptr<Storage> LoadStorage(const String& fileName);
/// Открыть файл как поток ввода.
/** Возвращает поток ввода, предназначенный для чтения файла.
\param fileName Имя файла.
\return Поток ввода.
*/
virtual ptr<InputStream> LoadStream(const String& fileName);
/// Сохранить файл.
/** Сохраняет файл в файловой системе, с заданным именем. Если файловая
система не поддерживает сохранение файлов, выбрасывается исключение.
\param file Файл, то есть данные, которые необходимо сохранить.
\param fileName Имя в файловой системе, под которым сохраняются данные.
*/
virtual void SaveFile(ptr<File> file, const String& fileName);
/// Открыть файл как поток вывода.
/** Возвращает поток вывода, предназначенный для записи в файл.
\param fileName Имя файла.
\return Поток вывода.
*/
virtual ptr<OutputStream> SaveStream(const String& fileName);
/// Получить время модификации файла.
virtual time_t GetFileMTime(const String& fileName);
/// Получить список имен файлов в файловой системе.
/** Получает список имен файлов. Не гарантируется, что он будет полным
и точным. Если файловая система не поддерживает получение списка
имен файлов, выбрасывается исключение.
\param fileNames Выходной список имен файлов.
*/
virtual void GetFileNames(std::vector<String>& fileNames) const;
/// Получить список файлов и каталогов в заданном каталоге (нерекурсивно).
/** Получает список имён файлов и каталогов в заданном каталоге.
Если файловая система не поддерживает это, выбрасывается исключение.
\param directoryName Имя каталога, оканчивающееся слешем.
\param entries Выходной список с относительными именами файлов и каталогов.
*/
virtual void GetDirectoryEntries(const String& directoryName, std::vector<String>& entries) const;
/// Получить список всех файлов и каталогов, начиная с данного каталога (рекурсивно).
/**
\param directoryName Имя каталога, оканчивающееся слешем.
\param entries Выходной список с абсолютными именами файлов и каталогов.
*/
virtual void GetAllDirectoryEntries(const String& directoryName, std::vector<String>& entries) const;
/// Create directory.
/**
\param directoryName Directory name with slash at the end.
*/
virtual void MakeDirectory(const String& directoryName);
/// Delete file or directory.
/**
\param entryName Entry name to delete.
*/
virtual void DeleteEntry(const String& entryName);
/// Get entry type.
/**
\param entryName File or directory name.
*/
virtual EntryType GetEntryType(const String& entryName) const;
/// Create sub file system.
virtual ptr<FileSystem> GetSubFileSystem(const String& folderName);
META_DECLARE_CLASS(FileSystem);
};
END_INANITY
#endif