文件服务器之三:存储
存储
*相关流的集合
*用于实现对象的持久性
*通常,存储是一个文件
- 尽管也提供内存存储
- 存储也可以嵌入其它存储的流中
*出于各种考虑,取代直接使用文件和文件服务器客户端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
*系统初始化文件使用了流字典
文件服务器之三:存储相关推荐
- 鸟哥的Linux私房菜(服务器)- 第二十一章、文件服务器之三: FTP 服务器
第二十一章.文件服务器之三: FTP 服务器 最近更新日期:2011/08/08 FTP (File Transfer Protocol) 可说是最古老的协议之一了,主要是用来进行档案的传输,尤其是大 ...
- 老外用的文件服务器,云存储服务市场乱战 老外到底都用啥
在云服务混战的今天,市场上出现了无数云存储服务提供商,这些服务提供商都希望用户可以注册他们的服务.为了吸引更多的用户,这些厂商会采用免费云存储的策略进行营销.在专门针对企业级的云服务市场,又有哪些是值 ...
- Windows 2003 R2的文件服务器实施
前言 Windows Server 2003 R2中的"文件服务器"新增加了对文件夹的磁盘配额和文件屏蔽功能,而在以前的版本中,只能对磁盘分区进行配置,并且没有 ...
- 存储技术与iSCSI
本章主要介绍基于IP SAN的网络存储iSCSI.iSCSI技术以其低廉的构建成本和优秀的存储性能,博得了很多CIO和存储管理员的喜爱,目前陆续进入企业应用领域,推动了企业的存储环境向集中式转变.虽然 ...
- 文件服务器 说明,文件服务器搭建说明.pdf
文件共享服务器搭建 责任人 姜 源 起讫时间 2010 11 15 至 2010 12 19 编号 JY001 0 目录目录 一 确定实现方案 1 二 方案实现方法 4 三 参考资料 12 1 文件服 ...
- 内卷了!DAS、NAS、SAN区别和FC SAN存储
内卷了!DAS.NAS.SAN区别和FC SAN存储 https://www.toutiao.com/i6943518812004172299/?tt_from=weixin&utm_camp ...
- 存储相关知识-DAS/SAN/NAS
存储相关知识-DAS/SAN/NAS 余二五 2017-11-15 22:16:00 浏览1826 服务器 主机 IP CPU 磁盘 存储 最近在看一些存储相关的东西,就顺手作了一些总结.我发现国内在 ...
- 服务器安全文件,文件服务器安全防护系统-虹安 - 数据防泄密,文档加密,源代码防泄密,数据防泄漏,DLP数据防泄密整体解决方案提供商...
主要保护文件服务器中存储.共享的数据资产只能被合法用户合规使用,防止敏感数据泄露.扩散.无论敏感数据存储在文件服务器中,还是已被下载至终端中,均可有效防护: 实现效果: 1.文件服务器中数据以密文形式 ...
- 如何搭建简易又安全的企业内部文件服务器?
提到搭建企业内部文件服务器,很多人的第一反应是Samba文件服务器. 确实,在过去的很多年里,大部分企业都是通过Windows Server的域控制器使企业内部员工方便地进行资源共享和使用网络打印机. ...
最新文章
- Java 重写(Override)与重载(Overload)
- 使用wordpress 搭建 文档索引服务器
- Android动态加载入门 简单加载模式
- C语言 从指定文件中依次读出字符直至文件结束
- SAP UI5 应用开发教程之四十一 - Chrome 扩展 UI5 Inspector 的离线安装和使用方法试读版
- MyBatis基于Maven入门实例
- nohup执行的jar 怎么kill_使用Shell脚本如何启动/停止Java的jar程序
- android studio for android learning (三) 我的第一个APP
- AirDisk创建网盘
- xxl-job shell脚本
- 板簧的弹性系数如何计算_滑板式钢板弹簧悬架变刚度计算方法的研究
- 东软始业教育结业考试
- 简单JAVA版本淘宝客程序上线
- 拉格朗日乘子法(自己总结一些要点)
- 哪一层提供了数据加密的功能?
- 【3D建模制作技巧分享】zbrush中如何卡硬边?
- 什么是抽象工厂模式?
- Java实现中文名字排序
- 下载tensorflow时遇到的问题
- 05.概念数据模型CDM
热门文章
- 第一章 Python Kivy 学习 -- Kivy介绍及环境安装
- Qualifying source code on HP-UX(chatr)
- GridLayout、FlowLayout和BorderLayout布局
- 串口通讯与步进电机驱动
- 【转】细说验证码安全 —— 测试思路大梳理
- 县域冠状动脉粥样硬化性心脏病分级诊疗
- (附源码)计算机毕业设计ssm大型零售电商平台——购物车管理子系统
- Android权限标签uses-permission
- java异常[java.util.regex.patternsyntaxexception dangling meta character ‘+‘ near index]解决
- 新基建下的智能安防:海康威视、大华股份们要给自己上道科技课