FileManager v1.7.0
Manage access to files with async model
Loading...
Searching...
No Matches
FileManager.h
1#pragma once
2
3#include <filesystem>
4#include <unordered_map>
5#include <map>
6#include <thread>
7#include <mutex>
8#include <fstream>
9#include <functional>
10#include <variant>
11#include <queue>
12#include <sstream>
13#include <future>
14
15#include "Cache.h"
16
17#include "Handlers/FileHandle.h"
18#include "Handlers/ReadFileHandle.h"
19#include "Handlers/WriteFileHandle.h"
20
21namespace file_manager
22{
24 class FILE_MANAGER_API FileManager
25 {
26 private:
27 enum class RequestType
28 {
29 read,
30 write
31 };
32
33 enum class RequestFileHandleType
34 {
35 read,
36 write,
37 readBinary,
38 writeBinary,
39 append,
40 appendBinary
41 };
42
43 private:
44 using FileCallback = std::variant<std::function<void(std::unique_ptr<ReadFileHandle>&&)>, std::function<void(std::unique_ptr<WriteFileHandle>&&)>>;
45
46 struct RequestStruct
47 {
48 FileCallback callback;
49 std::promise<void> requestPromise;
50 RequestFileHandleType handleType;
51
52 RequestStruct(FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
53 };
54
55 friend bool operator == (const RequestStruct& request, RequestType type);
56
57 private:
58 class FileNode
59 {
60 private:
61 struct FilePathState
62 {
63 std::atomic_size_t readRequests;
64 std::atomic_bool isWriteRequest;
65
66 FilePathState();
67 };
68
69 private:
70 std::queue<RequestStruct> requests;
71 std::mutex requestsMutex;
72
73 public:
74 FilePathState state;
75
76 public:
77 FileNode() = default;
78
79 void addRequest(FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
80
81 void processQueue(const std::filesystem::path& filePath);
82
83 ~FileNode() = default;
84 };
85
86 class FILE_MANAGER_API NodesContainer
87 {
88 private:
89 std::unordered_map<std::filesystem::path, FileNode*, utility::pathHash> data;
90 mutable std::mutex readWriteMutex;
91
92 public:
93 NodesContainer() = default;
94
95 void addNode(const std::filesystem::path& filePath);
96
97 FileNode* operator [](const std::filesystem::path& filePath) const;
98
99 inline ~NodesContainer()
100 {
101 for (const auto& [_, value] : data)
102 {
103 delete value;
104 }
105
106 data.clear();
107 }
108 };
109
110 private:
111 Cache cache;
112 NodesContainer nodes;
113 std::shared_ptr<threading::ThreadPool> threadPool;
114
115 private:
116 static void threadPoolCallback(std::promise<void>&& requestPromise);
117
118 public:
119 FileHandle* createHandle(const std::filesystem::path& filePath, RequestFileHandleType handleType);
120
121 void notify(std::filesystem::path&& filePath);
122
123 void addRequest(const std::filesystem::path& filePath, FileCallback&& callback, std::promise<void>&& requestPromise, RequestFileHandleType handleType);
124
125 void decreaseReadRequests(const std::filesystem::path& filePath);
126
127 void completeWriteRequest(const std::filesystem::path& filePath);
128
129 private:
130 FileManager();
131
132 FileManager(size_t threadsNumber);
133
134 FileManager(std::shared_ptr<threading::ThreadPool> threadPool);
135
136 FileManager(const FileManager&) = delete;
137
138 FileManager(FileManager&&) noexcept = delete;
139
140 FileManager& operator = (const FileManager&) = delete;
141
142 FileManager& operator = (FileManager&&) noexcept = delete;
143
144 ~FileManager() = default;
145
146 private:
147 std::future<void> addReadRequest(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<ReadFileHandle>&&)>& callback, RequestFileHandleType handleType, bool isWait);
148
149 std::future<void> addWriteRequest(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<WriteFileHandle>&&)>& callback, RequestFileHandleType handleType, bool isWait);
150
151 public:
158 static FileManager& getInstance();
159
165 static FileManager& getInstance(size_t threadsNumber);
166
172 static FileManager& getInstance(std::shared_ptr<threading::ThreadPool> threadPool);
173
178 static std::string getVersion();
179
185 void addFile(const std::filesystem::path& filePath, bool isFileAlreadyExist = true);
186
193 std::future<void> readFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<ReadFileHandle>&&)>& callback, bool isWait = true);
194
201 std::future<void> readBinaryFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<ReadFileHandle>&&)>& callback, bool isWait = true);
202
207 std::future<void> writeFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<WriteFileHandle>&&)>& callback, bool isWait = true);
208
213 std::future<void> appendFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<WriteFileHandle>&&)>& callback, bool isWait = true);
214
219 std::future<void> writeBinaryFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<WriteFileHandle>&&)>& callback, bool isWait = true);
220
225 std::future<void> appendBinaryFile(const std::filesystem::path& filePath, const std::function<void(std::unique_ptr<WriteFileHandle>&&)>& callback, bool isWait = true);
226
229 Cache& getCache();
230
233 const Cache& getCache() const;
234
235 friend class FileHandle;
236 friend class ReadFileHandle;
237 friend class WriteFileHandle;
238 friend class Cache;
239 friend struct std::default_delete<FileManager>;
240 };
241}
Files cache.
Definition Cache.h:19
Provides files accessing from multiple threads. Singleton.
Definition FileManager.h:25
static FileManager & getInstance(std::shared_ptr< threading::ThreadPool > threadPool)
Singleton getter.
Provides reading files.
Provides writing files.