files_file_system.h
1 #pragma once 2 3 #include <cstdint> 4 #include <cstddef> 5 6 #include "files_storage_driver.h" 7 8 namespace files 9 { 10 template <typename FileHandle, 11 typename DirectoryHandle = nullptr_t, 12 typename FileInfoHandle = nullptr_t> 13 class FileSystem 14 { 15 public: 16 FileSystem() = default; 17 virtual ~FileSystem() = default; 18 FileSystem(const FileSystem&) = delete; 19 FileSystem& operator=(const FileSystem&) = delete; 20 21 // disk operation interface 22 virtual bool Mount() = 0; 23 virtual bool Unmount() = 0; 24 25 // file interface 26 virtual bool FileOpen(FileHandle& file, const char* filePath, uint16_t mode) = 0; 27 virtual bool FileRead(FileHandle& file, void* buffer, size_t amountToRead, size_t* amountRead) = 0; 28 virtual bool FileWrite(FileHandle& file, const void* buffer, size_t bufferLength, size_t* amountWritten) = 0; 29 virtual bool FileSeek(FileHandle& file, size_t offset) = 0; 30 virtual bool FileClose(FileHandle& file) = 0; 31 32 // directory interface 33 virtual bool DirectoryOpen(DirectoryHandle& dir, const char* directoryPath) = 0; 34 virtual bool DirectoryRead(DirectoryHandle& dir, FileInfoHandle& info) = 0; 35 virtual bool DirectoryClose(DirectoryHandle& dir) = 0; 36 37 // file information interface 38 virtual bool FileStat(FileInfoHandle& fileInfo, const char* path) = 0; 39 40 // drive information interface 41 virtual inline const char* GetDriveLabel() { return ""; } 42 virtual inline uint32_t GetDriveSerial() { return 0; } 43 44 // disk information interface 45 virtual inline bool IsMounted() { return mounted; } 46 47 // directory styling 48 inline virtual constexpr const char* GetRootDirectory() { return DirectoryUnixStyleRoot; } 49 inline virtual constexpr const char* GetRelativeCurrentDirectory() { return DirectoryOneDot; } 50 inline virtual constexpr const char* GetRelativeParentDirectory() { return DirectoryTwoDots; } 51 inline virtual constexpr const char GetDirectorySeperator() { return DirectorySeperatorUnix; } 52 53 protected: 54 static constexpr const char* DirectoryUnixStyleRoot = "/"; 55 static constexpr const char* DirectoryOneDot = "."; 56 static constexpr const char* DirectoryTwoDots = ".."; 57 static constexpr const char DirectorySeperatorUnix = '/'; 58 static constexpr const char DirectorySeperatorWindows = '\\'; 59 60 bool mounted = false; 61 }; 62 } // namespace files