Extra2D/include/platform/file_module.h

180 lines
3.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <module/module.h>
#include <module/module_registry.h>
#include <string>
#include <types/base/types.h>
#include <vector>
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<uint8> 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<FileInfo> 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