# ResourceFileSystem **命名空间**: `XCEngine::Resources` **类型**: `class` **头文件**: `XCEngine/Resources/FileSystem.h` **描述**: 资源文件系统,负责资源文件的查找、读取和虚拟文件系统(支持目录和归档包)管理。 ## 概述 `ResourceFileSystem` 实现了虚拟资源文件系统,支持从多个目录和归档包(如 `.zip`、`.pak`)中查找和读取资源。它通过 `IArchive` 接口支持不同的归档格式,并提供资源信息缓存。 ## 单例访问 | 方法 | 描述 | |------|------| | `static ResourceFileSystem& Get()` | 获取单例实例 | ## IArchive 接口 抽象归档接口,用于封装单个归档包或目录的读取操作。 ### 公共方法 | 方法 | 描述 | |------|------| | `virtual bool Open(const Containers::String& path)` | 打开归档 | | `virtual void Close()` | 关闭归档 | | `virtual bool Read(const Containers::String& fileName, void* buffer, size_t size, size_t offset) const` | 从归档中读取文件 | | `virtual size_t GetSize(const Containers::String& fileName) const` | 获取文件大小 | | `virtual bool Exists(const Containers::String& fileName) const` | 检查文件是否存在 | | `virtual void Enumerate(const Containers::String& pattern, Containers::Array& outFiles) const` | 枚举匹配的文件 | | `virtual bool IsValid() const` | 是否有效 | ## ResourceInfo 结构体 | 成员 | 类型 | 描述 | |------|------|------| | `path` | `Containers::String` | 资源相对路径 | | `size` | `size_t` | 文件大小(字节) | | `modifiedTime` | `Core::uint64` | 修改时间戳 | | `inArchive` | `bool` | 是否在归档包中 | | `archivePath` | `Containers::String` | 所属归档路径 | ## 公共方法 | 方法 | 描述 | |------|------| | `Initialize()` | 初始化,设置资源根目录 | | `Shutdown()` | 关闭,释放所有归档 | | [`AddArchive`](addarchive.md) | 添加归档包(优先查找) | | [`AddDirectory`](adddirectory.md) | 添加资源目录 | | [`RemoveArchive`](removearchive.md) | 移除归档包 | | [`FindResource`](findresource.md) | 查找资源的绝对路径 | | [`Exists`](exists.md) | 检查资源是否存在 | | [`ReadResource`](readresource.md) | 读取资源文件内容(字节数组) | | [`GetResourceInfo`](getresourceinfo.md) | 获取资源信息 | | [`EnumerateResources`](enumerateresources.md) | 枚举匹配的资源 | ## 实现说明 **注意**: 当前 `GetResourceInfo()` 不填充 `modifiedTime` 字段,`EnumerateResources()` 为 stub 实现。 ## 使用示例 ```cpp // 初始化资源文件系统 ResourceFileSystem::Get().Initialize("resources/"); // 添加归档包(优先于目录) ResourceFileSystem::Get().AddArchive("data/resources.pak"); // 添加额外资源目录 ResourceFileSystem::Get().AddDirectory("user_content/"); // 检查资源是否存在 if (ResourceFileSystem::Get().Exists("textures/player.png")) { // 读取资源 auto data = ResourceFileSystem::Get().ReadResource("textures/player.png"); // 使用数据... } // 获取资源信息 ResourceInfo info; if (ResourceFileSystem::Get().GetResourceInfo("shaders/default.vert", info)) { printf("Size: %zu, InArchive: %s\n", info.size, info.inArchive ? "yes" : "no"); } // 枚举资源 Containers::Array textures; ResourceFileSystem::Get().EnumerateResources("textures/*.png", textures); for (const auto& tex : textures) { printf("Found: %s\n", tex.path.CStr()); } // 关闭 ResourceFileSystem::Get().Shutdown(); ``` ## 相关文档 - [ResourceManager](../resourcemanager/resourcemanager.md) - 资源管理器 - [IResourceLoader](../iloader/iloader.md) - 资源加载器 - [Resources 总览](../resources.md) - 返回模块总览