#pragma once #include #include using File = FsFile; class HalStorage { public: HalStorage(); bool begin(); bool ready() const; std::vector listFiles(const char* path = "/", int maxFiles = 200); // Read the entire file at `path` into a String. Returns empty string on failure. String readFile(const char* path); // Low-memory helpers: // Stream the file contents to a `Print` (e.g. `Serial`, or any `Print`-derived object). // Returns true on success, false on failure. bool readFileToStream(const char* path, Print& out, size_t chunkSize = 256); // Read up to `bufferSize-1` bytes into `buffer`, null-terminating it. Returns bytes read. size_t readFileToBuffer(const char* path, char* buffer, size_t bufferSize, size_t maxBytes = 0); // Write a string to `path` on the SD card. Overwrites existing file. // Returns true on success. bool writeFile(const char* path, const String& content); // Ensure a directory exists, creating it if necessary. Returns true on success. bool ensureDirectoryExists(const char* path); File open(const char* path, const oflag_t oflag = O_RDONLY); bool mkdir(const char* path, const bool pFlag = true); bool exists(const char* path); bool remove(const char* path); bool rmdir(const char* path); bool openFileForRead(const char* moduleName, const char* path, File& file); bool openFileForRead(const char* moduleName, const std::string& path, File& file); bool openFileForRead(const char* moduleName, const String& path, File& file); bool openFileForWrite(const char* moduleName, const char* path, File& file); bool openFileForWrite(const char* moduleName, const std::string& path, File& file); bool openFileForWrite(const char* moduleName, const String& path, File& file); bool removeDir(const char* path); static HalStorage& getInstance() { return instance; } private: static HalStorage instance; bool initialized = false; }; #define Storage HalStorage::getInstance()