namespace Components { class FileSystem : public Component { public: class File { public: File() {}; File(std::string file) : filePath(file) { this->read(); }; bool exists() { return !this->buffer.empty(); }; std::string getName() { return this->filePath; }; std::string& getBuffer() { return this->buffer; }; private: std::string filePath; std::string buffer; void read(); }; class FileReader { public: FileReader() : size(-1), name(), handle(0) {}; FileReader(std::string file); ~FileReader(); bool exists(); std::string getName(); std::string getBuffer(); int getSize(); bool read(void* buffer, size_t size); void seek(int offset, int origin); private: int handle; int size; std::string name; }; class FileWriter { public: FileWriter(std::string file) : filePath(file), handle(0) { this->open(); }; ~FileWriter() { this->close(); }; void write(std::string data); private: int handle; std::string filePath; void open(); void close(); }; FileSystem(); ~FileSystem(); #if defined(DEBUG) || defined(FORCE_UNIT_TESTS) const char* getName() { return "FileSystem"; }; #endif static std::vector GetFileList(std::string path, std::string extension); static std::vector GetSysFileList(std::string path, std::string extension, bool folders = false); static void DeleteFile(std::string folder, std::string file); private: static std::mutex Mutex; static Utils::Memory::Allocator MemAllocator; static int ReadFile(const char* path, char** buffer); static char* AllocateFile(int size); static void FreeFile(void* buffer); static void RegisterFolder(const char* folder); static void RegisterFolders(); static void StartupStub(); static int ExecIsFSStub(const char* execFilename); }; }