现在的位置: 首页 > 综合 > 正文

文件服务器之三:存储

2018年03月19日 ⁄ 综合 ⁄ 共 2692字 ⁄ 字号 评论关闭

存储
*相关流的集合
*用于实现对象的持久性
*通常,存储是一个文件
 - 尽管也提供内存存储
 - 存储也可以嵌入其它存储的流中
*出于各种考虑,取代直接使用文件和文件服务器客户端API
 - 尽管与文件服务器的其它特征依然相关
*对于应用程序的框架意义重大,因为它提供对嵌入文档的支持
*存储也是DBMS提供的相关数据库的基础

 

 

存储流
*在存储中适合使用流这种类型
*流通常是在存储地上下文中创建的
*存储中的流由如下两个具体类中的一个封装
 - RStoreWriteStream代表写入流
  ·支持存储中流的创建和操作
 - RStorReadStream代表读取流
  ·支持存储中已存在的流的打开的操作

 

 

流ID
*在存储中,流的唯一的标识
 - 由TStreamId类封装
*用于给定的存储上下文中,并用来打开流
 - 比如 RStoreReadStream::OpenLC(CFileStore& store, TStreamId streamId);
*TStreamId提供ExternalizeL()和InternalizeL()函数
 - 流的ID可以外部化到其它流中,这是流网络的基础
*在存储中保存
 - 如果只有一个流,那么流ID保存在存储根中
 - 如果存储包含不止一个流,那么流ID保存在流字典中

 

 

使用存储流
*RStoreWriteStream
 - CreateL()或CreateLC()可以在存储中创建一个新的流
 - OpenL()或OpenLC()可以在存储中打开一个已经存在的流用于写操作
  ·注意,并不是所有的存储类型都支持已有的流的修改操作
 - CommitL()执行流的外部化操作
  ·作为一条简单的准则,CreateL()或CreateLC()通过调用CommitL()得以匹配
*RStoreReadStream
 - OpenL()或OpenLC()在存储中打开已有的流用于读操作

使用存储流-示例
*使用RStoreWriteStream的CreateL()或CreateLC()成员函数在存储中创建一个新的流,并且返回该流的ID
RStoreWriteStream outstream;
TStreamId id = outstream.CreateLC(*store);
...
CleanupStack::PopAndDestory();
...
*使用RStoreReadStream的OpenL()或OpenLC()成员函数来打开一个流,并且用于读取操作
RStoreReadStream instream;
TStream id;
...
instream.OpenLC(*store,id);
...

 

存储类型
*CStreamStore定义了在存储中添加和删除流的接口
 - 也提供执行/恢复机制,以及空间压缩和回收
*存储类型基于流存储范例
 - 持久存储
 - 嵌入存储
 - 字典存储
 - 内存存储

 

持久存储
*在创建存储的应用程序的生命周期之外,提供存储的持久性
 - 比如,文件存储
*尤其提供
 - 根流,通过它可以找到存储中所有的其它的流
 - 打开和关闭存储的函数
*CPersistentStore,继承自CStreamStore

文件存储
*文件存储是持久性的存储,它可以用来实现应用程序的数据文件
*CFileStore派生的文件存储有两种类型
 - 直接文件存储,由具体类CDirectFileStore进行封装
  ·直接文件存储适用于将数据内存拷贝作为主要拷贝的应用程序,比如文字处理器,这类应用程序实现了经典的载入/保存范例
 - 持久文件存储,有具体类CPermanetFileStore进行封装
  ·通常,持久文件存储适用于数据库应用程序,这类应用程序将所有的数据保存在文件中,但是偶尔会编辑数据库中的一些条目

使用文件存储
*CreateLC()创建一个存储
*RepalceLC()替换已有存储
*Open()或OpenLC()打开一个已有存储
*File()从存储中获得RFile对象的拷贝
*Detach()将存储和文件分离,实际上是放弃了文件的所有权
*Reattach()重新建立文件和文件存储的关联,实际上是获取该文件的所有权

使用文件存储- 示例
*在如下的代码片段中
 - 与文件存储相关联的文件被分离和关闭
 - 该文件然后重新打开并和该文件存储重新建立关联

LOCAL_C void doUseL(const TDesC& aName)
{
 TParse filestorename;
 ...
 fsSession.Parse(aName,filestorename);
 CFileStore* store = CPermanentFileStore::OpenLC(fsSession, filestorename, FullName(), EFileRead|EFileWrite);
 RFile thefile = store->File();
 store->Detach();
 thefile.Close();
 ...
 thefile.Open(fsSession,filestorename.FullName(), EFileRead|EFileWrite);
 store->Reattach(thefile);
 ...
}

 

嵌入存储
*可以在其它存储中以流的形式保存
*用来代表一个部分对象网络
 - 通过从包含的存储中拷贝(或删除)主要的流,可以更加简便地实现部分对象网络操作
*行为和直接文件存储类似
 - 一旦写入,存储中的流就不能被修改
*用于嵌入应用程序框架的对象
 - 只能嵌入直接代表文档的类型
*CEmbeddedStore,继承自CPersistentstore

 

字典存储
*按照通常方式包含流,但是不同的是,根流是流字典
 - 流通过UID访问,而不是直接通过流ID访问
 - 主要被应用程序框架用来处理.ini文件
*接口由CDictionaryStore抽象类提供
 - CDictionaryFileStore是具体类的一个示例,它使用文件存储来实现
*并非继承自CStreamStore,但是拥有自己的持久存储CPersistentStore和流字典CStreamDictionary
*特殊的流类型RDictionaryWriteStream和RDictionaryReadStream主要用于字典存储

流字典
*维持一张列表,用来保持UID和流ID之间的对应关系
 - UID按照特定的目的来标识流
*每一个TUid和TStreamId对构成了数组的一个条目
*类型CStreamDictionary
 - 提供成员函数来管理数组条目,比如,添加新的条目,或者改变与UID相关联的流ID
*系统初始化文件使用了流字典

抱歉!评论已关闭.