#pragma once #include #include #include #include #include namespace extra2d { /** * @brief 文件信息 */ struct FileInfo { std::string path; std::string name; bool isDir = false; int64 size = 0; }; /** * @brief 文件读取结果 */ struct FileData { bool ok = false; std::vector data; std::string error; operator bool() const { return ok; } const uint8 *ptr() const { return data.data(); } size_t size() const { return data.size(); } }; /** * @brief 文件模块 * * 提供跨平台文件系统操作 * 非单例设计,通过 Context 管理生命周期 */ class FileModule : public Module { // 优先级为 2,系统级模块,在 TimerModule (优先级 4) 之前初始化 E2D_REGISTER_MODULE(FileModule, "File", 2) public: FileModule(); ~FileModule() override; // 禁止拷贝 FileModule(const FileModule &) = delete; FileModule &operator=(const FileModule &) = delete; // 允许移动 FileModule(FileModule &&) noexcept; FileModule &operator=(FileModule &&) noexcept; // Module 接口实现 bool init() override; void shutdown() override; /** * @brief 检查文件是否存在 */ bool exists(const std::string &path) const; /** * @brief 检查是否为目录 */ bool isDir(const std::string &path) const; /** * @brief 读取整个文件到内存 */ FileData read(const std::string &path) const; /** * @brief 读取文件为字符串 */ std::string readString(const std::string &path) const; /** * @brief 写入数据到文件 */ bool write(const std::string &path, const void *data, size_t size) const; /** * @brief 写入字符串到文件 */ bool writeString(const std::string &path, const std::string &content) const; /** * @brief 追加数据到文件 */ bool append(const std::string &path, const void *data, size_t size) const; /** * @brief 删除文件 */ bool remove(const std::string &path) const; /** * @brief 创建目录 */ bool mkdir(const std::string &path) const; /** * @brief 列出目录内容 */ std::vector listDir(const std::string &path) const; /** * @brief 获取文件大小 */ int64 fileSize(const std::string &path) const; /** * @brief 获取文件扩展名 */ std::string ext(const std::string &path) const; /** * @brief 获取文件名(不含路径) */ std::string fileName(const std::string &path) const; /** * @brief 获取文件所在目录 */ std::string dirName(const std::string &path) const; /** * @brief 连接路径 */ std::string join(const std::string &a, const std::string &b) const; /** * @brief 获取可写目录(用于存档等) */ std::string writableDir() const; /** * @brief 设置资源根目录 */ void setAssetRoot(const std::string &root) { assetRoot_ = root; } /** * @brief 获取资源根目录 */ const std::string &assetRoot() const { return assetRoot_; } /** * @brief 获取资源完整路径 */ std::string assetPath(const std::string &relPath) const; /** * @brief 检查路径是否为 RomFS 路径 * @param path 文件路径 * @return 是否以 "romfs:/" 开头 */ bool isRomfsPath(const std::string &path) const; /** * @brief 设置 RomFS 资源根目录(用于 Switch 平台) * @param root RomFS 根目录,默认为 "romfs:/" */ void setRomfsRoot(const std::string &root) { romfsRoot_ = root; } /** * @brief 获取 RomFS 资源根目录 */ const std::string &romfsRoot() const { return romfsRoot_; } private: std::string assetRoot_; std::string writableDir_; std::string romfsRoot_ = "romfs:/"; }; } // namespace extra2d