Ogre文件系统

本文介绍了Ogre框架中针对C语言FILE和C++ stream的适配类Ogre::FileHandleDataStream和Ogre::FileStreamDataStream,以及如何使用Ogre::DeflateStream进行文件压缩和读取压缩文件,该实现基于zlib库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、文件容器和文件管理
OGRE 文件系统的核心是 Archive 和 DataStream。其中:Archive 泛指文件容器,可以是文件夹,也可以是压缩包,甚至可以为远程位置(Ogre1.06 还未发现有此功能)。
DataStream 完成与 std::basic_istream 相同的功能,它既可以读取普通的文件,压缩文件,以及内存文件等。
   
1、Archive 
为完成 Archive 的功能(如列举目录下的文件,获取文件信息,查找文件等)OGRE提 供 了 一 个 统 一 的 接 口 ( 抽 象 基 类 ) Ogre::Archive , 具 体 的 实 现 分 别 由Ogre::FileSystemArchive 和 Ogre::ZipArchive 完成。由名称就可以看出它们的功能。
关于 Archive 的实例化,OGRE 采用了创建型设计模式中的抽象工厂模式。工厂模式在 OGRE 中其他地方也用到,因此有一个泛型工厂 Ogre::FactoryObj< T >:有了 Ogre::ArchiveFactory,就可以根据功能创建需要的 Archive 类型。若不能满足需要,用户可以以 Plug-in 形式扩充 Archive,一个 Archive 对应一个ArchiveFactory。
为 了 便 于 二 者 的 管 理 , OGRE 提 供 了 一 个 Archive 管 理 类——Ogre::ArchiveManager(使用了单件模式):所有的 ArchiveFactory 都必须注册到 ArchiveManager 中(OGRE 在 Root 的构造函数中注册上述两种 ArchiveFactory)。这样当给 ArchiveManager 一个路径和路径的类型时(load),ArchiveManager 就可以返回一个与类型的 Archive。删除Archive 也需要经过 ArchiveManager 卸载(unload)。
看一下 ArchiveManager 内部的数据结构:
        typedef std::map<String, ArchiveFactory*> ArchiveFactoryMap; 
        ArchiveFactoryMap mArchFactories; 
        typedef std::map<String, Archive*> ArchiveMap; 
        ArchiveMap mArchives; 
2、Data Stream 
  Data Stream 完成与 std::basic_istream 相同的功能,但 Data Stream 的数据来源多种多样,包括与 STL stream 接口不兼容的 lib(如 zlib)。为满足各种情况,OGRE 为Data Stream 提供如下的继承体系,从名称可以看出各自的功能:
   
Ogre::DataStream 是一个抽象的基类,具体的操作(如 readLine、skip、seek、tell 等)由其子类负责实现。从设计模式的角度看,是属于适配器模式。
1) Ogre::MemoryDataStream 
Memory Data Stream可以看作是一块内存区域,OGRE 分配的是一块 usingned char 内存,由’\n’形成行。对 Memory Data Stream 的操作,可以看作是对字符串的处理,只不过其接口是按照文件的标准来设计的。
2) Ogre::ZipDataStream 
OGRE 是用 zziplib 实现读取压缩文件。它是对 zziplib 包装,使 zziplib 能够符合Ogre::DataStream 的接口。

3) Ogre::FileHandleDataStream 和 Ogre::FileStreamDataStream 

分别为对 C 语言的 FILE 和 C++ stream 的适配。

4)    Ogre::DeflateStream

实现对文件的压缩、读取压缩文件,是对zlib的适配

3、Archive 和 DataStream 之间的关系
 Archive 可以看作是文件夹(包括压缩的),里面包含有文件,而 DataStream 是对文件的操作(读取、修改等)。
读取文件夹是为了读取其中的文件,因此,一个程序若提供了一个 ArchiveFactory,也应该提供一个 DataStream 以从 Archive 中读取出数据。除非现有的 DataStream 实现能够满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值