




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件结构化存储技术与应用 (转载)VC+ 2010-12-08 10:02:22 阅读0 评论0 字号:大中小订阅 自从Windows系统推出以后,微软公司就一直致力于完善和采用新的文件存储方法,其中结构化存储是微软公司最为推崇的,该技术采用COM技术架构,当前广泛使用的Office文 件都是采用结构化的存储方式,同时微软公司为推广这一存储方法的应用,在Windows SDK中提供了该技术的整套帮助文件和相关资料。所谓结构化存储方法,实际是把树状文件系统的原理应用到单个的文件中,使得单个文件也能象文件系统一样包含子目录,子目录还可以包含更深层次的子目录,各个目录可以含多个文件,把原来需要多个文件存储的内容按树状结构和层次保存到一个文件中去。对清楚磁盘存储的用户来说,很容易理解这种存储方法可以极大程度的提高磁盘空间使用效率。另外便于在单个文件就能明确内容的归属关系和分类关系,再就是在软件分发过程不需要带一大批的分发文件,可以把数据文件归结到一个文件中去。本文将阐述Windows提供的结构化存储的相关技术,并且用Delphi语言加以应用实现。一、结构化存储技术介绍在Windows SDK中详细介绍了结构化存储的各个相关的知识,上面已经讲到该技术采用Com架构,所以提供的函数都用到接口,其中IStorage、Istream、IEnumSTATSTG是三个最重要的结构化存储接口(Interface)。1、IStorageIStorage接口支持结构化存储文件创建和结构化文件管理的相关功能。它可以包含其它的多个IStorage,相当于文件系统中的子目录,也可以包含下面要阐述的多个Istream,相当于文件系统的具体单个文件。一个结构化存储的文件可以用下图来表示它的结构。从上图我们可以看到任何一个结构化存储文件都存在一个根IStorage,在该接口下面可以包含多个一级子IStorage,一级子IStorage下可以包含多个二级子IStorage,依次延续,就形成了结构化存储文件的层次和树状结构,而每个IStorage下面可以含任意个Istream即相当与文件系统中具体的单个文件。关于IStorage的主要函数有:1.1 StgCreateDocfile该函数创建一个结构化存储的文件,并且返回IStorage接口,其函数格式为:HRESULT StgCreateDocfile(const WCHAR * pwcsName, /要创建的结构化存储文件名DWORD grfMode, /结构化存储文件的访问模式DWORD reserved, /保留,必须为零IStorage * ppstgOpen /返回的IStorage接口变量);1.2 StgOpenStorage该函数打开一个结构化存储的文件,并且返回IStorage借口,起函数格式为:HRESULT StgOpenStorage(const WCHAR * pwcsName, /要打开的结构化存储文件IStorage * pstgPriority, /以前打开的IStorage 一般为nilDWORD grfMode, /文件打开的模式SNB snbExclude, /代表SNB结构,可以为nilDWORD reserved, /保留,必须为0IStorage * ppstgOpen /返回的IStorage接口变量);1.3 StgIsStorageFile该函数判断指定文件是否是按照结构化方式存储。其函数格式为:HRESULT StgIsStorageFile(const WCHAR * pwcsName /需要判断的文件名);1.4 CreateStorage该函数是IStorage接口提供的函数,它为IStorage创建一个下一个层次的IStorage,也即相当于创建子目录。其函数格式为:HRESULT CreateStorage(const wchar_t * pwcsName, /要创建的子IStorage的名称DWORD grfMode, /子Istorage的访问模式DWORD reserved1, /保留,必须为零DWORD reserved2, /保留,必须为零IStorage * ppstg /返回的IStorage接口变量);1.5 CreateStream该函数是IStorage接口提供的函数,它为IStorage创建一个下属的IStream,也即相当于创建单个具体文件。其函数格式为:HRESULT CreateStream(const wchar_t * pwcsName, /要创建子Istream的名称DWORD grfMode, /子IStream的访问模式DWORD reserved1, /保留,必须为零DWORD reserved2, /保留,必须为零IStream * ppstm /返回的IStream接口变量);1.6 OpenStorage该函数是IStorage接口提供的函数,打开当前IStorage的子IStorage,其函数格式为:HRESULT OpenStorage(const wchar_t * pwcsName, /子IStorage名IStorage * pstgPriority, /以前打开的IStorage 一般为nilDWORD grfMode, /打开IStorage的访问模式SNB snbExclude, /SNB模块,一般为nilDWORD reserved, /保留,必须为零IStorage * ppstg /返回的IStorage接口变量);1.7 OpenStream该函数是IStorage接口提供的函数,打开当前IStorage的子IStream,其函数格式为:HRESULT OpenStream(const wchar_t * pwcsName, /要打开的IStream名void * reserved1, /保留,必须为nilDWORD grfMode, /打开的Istream访问模式DWORD reserved2, /保留,必须为零IStream * ppstm /返回的IStream接口变量);1.8 EnumElements该函数是IStorage接口提供的函数,获取IStorage内含内容的枚举IEnumSTATSTG接口,通过IEnumSTATSTG可以获取结构化存储文件的树状和层次结构。关于IEnumSTATSTG在后面将再作介绍,其函数格式为:HRESULT EnumElements(DWORD reserved1, /保留,必须为零void * reserved2, /保留,必须为nilDWORD reserved3, /保留,必须为0IEnumSTATSTG * ppenum /返回的IEnumSTATSTG接口变量);1.9 MoveElementTo该函数是IStorage接口提供的函数,把IStorage下的子IStorage或者子IStream进行移动或者复制。其函数格式为:HRESULT MoveElementTo(const wchar_t pwcsName, /要移动或复制的IStorage、Istream名IStorage * pstgDest, /要移动或复制到目标IStorage的名LPWSTR pwcsNewName, /移动或复制到新目的地后的名称DWORD grfFlags /标志是移动还是复制);1.10 RenameElement、DestroyElement该函数是IStorage接口提供的函数,对IStorage进行重新命名和删除。其函数格式略。关于IStorage接口还提供了其它的一些函数,需要更加详细地了解可以参考Windows SDK API的相关函数。2、IStreamIStream接口是嵌套在IStorage中,其主要功能是具体实现从结构化存储文件读取数据,同时实现向结构化存储文件中写数据。该接口提供的函数主要有以下几个:2.1 Read,从IStream中读取数据,其函数格式为:HRESULT Read(void * pv, /数据读取出来存放到变量ULONG cb, /需要读取的字节数ULONG * pcbRead /实际读取的字节数);2.2 Write,向IStream中写入数据,其函数格式为:HRESULT Write(void const* pv, /要写入数据的常量ULONG cb, /需要写入的字节数ULONG * pcbWritten /实际写入的字节数);2.3 Seek,移动读写的文件指针,其函数格式为:HRESULT Seek(LARGE_INTEGER dlibMove, /文件指针移动的字节数DWORD dwOrigin, /文件指针从那个位置进行字节移动ULARGE_INTEGER * plibNewPosition /新指针位置可以为nil);3、IEnumSTATSTGIEnumStatSTG接口是实现对结构化存储文件的树状浏览,其函数相对简单主要有以下三个:HRESULT Next(ULONG celt, STATSTG * rgelt, ULONG * pceltFetched)HRESULT Skip(ULONG celt)HRESULT Reset(void)二、Delphi中应用结构化存储的几个要点1、结构化存储技术是采用COM的技术架构,它的应用相对于常用的存储技术有一定差异。在Delphi语言中对流(Stream)的操作都是基于Tstream派生出来,象TFileStream、TMemoryStream等等都是Tstream的子类,而Delphi提供的具有相当好操作性的Treader和Twriter都是和Tstream类相对应操作的。为保持Delphi语言应用的一贯性和相互融通,Delphi语言特别提供了一个Tstream派生类TOLEStream,它专门用于针对IStream接口的相关操作。TOLEStream的构造函数为:Constructor Create(const Stream: IStream);虽然通过IStorage和IStream可以实现结构化存储技术进行文件的存取,但本人建议Delphi语言开发中最好通过TOLEStream实现结构化存储文件的存取工作。TOLEStream在Axctrls.pas中实现。2、Delphi语言为方便开发人员,把结构化存储技术的相关函数和接口都进行封装,统一在Activex.pas单元中加以引用实现,所以要引用上述的IStorage、IStream以及相关的函数要把Activex做为引用单元。3、关于IStorage和IStream相关函数的返回值都是Hresult,如果函数运行正常一般返回值为S_OK,为检验返回值是否正确可以调用OLECheck函数,如果IStorage和IStream相关函数返回的信息是错误的话,OLECheck将引发 EoleSysError类的错误供开发人员调试和运行中检测。OLECheck函数封装在ComOBJ.pas单元中。4、一般情况下,任何一个对象有创建就有释放相对应,但IStorage和IStream不需要人工释放,系统将会根据这两个接口的引用计数器是否为零自动释放,所以不要调用IStorage.release或IStream.release。三、结构化存储技术应用举例有了上面的知识以后,就可以把结构化存储技术运用到我们的程序开发中。这里主要举两个例子来简要阐述结构化存储的应用。1、创建结构化存储文件这里介绍如何一个具有两个层次的结构化存储文件,一个Root-IStorage,一个Sub-IStorage,在Sub-Istorage下一个IStream。Uses Activex, axctrls,comobj;Procedure CreateSTGFile;VarRootSTG,SubSTG :IStorage;IST :IStreamOST :TOLESTream;temp :Pchar;BeginTry/建立根存储接口 (Root-IStorage)olecheck(stgcreatedocFile(demo.stg,stgm_create or stgm_readwrite or stgm_share_exclusive,0,RootSTG);/创建子存储接口olecheck(RootSTG.CreateStorage(substorage,stgm_create or stgm_write or stgm_share_exclusive,0,0,subSTG);/创建IStreamolecheck(substg.createstream(descript,stgm_create or stgm_write or stgm_share_exclusive,0,0,IST);/创建OLEStreamOST:=TOLEStream.create(IST);Temp:=结构化存储文件演示;OST.write(temp,length(string(temp); /写入数据OST.Free;excepton EoleSysError do showmessage(File Create Error!);end;End;2、读取结构化存储文件这里介绍如何读取上面建立的文件Procedure ReadSTGFile;VarRootSTG,SubSTG :IStorage;IST :IStreamOST :TOLESTream;temp :array1.1024 of char;BeginTry/判断是否为结构化存储文件if StgIsStorage
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考点解析-北师大版8年级数学上册期中试题及答案详解一套
- 2025版高端泥工装修施工服务合同
- 2025版城市燃气供应与居民用气合作协议
- 2025年度光伏电站变配电系统设计与施工合同
- 2025版医疗保健机构员工人事合同范本
- 2025版智能化砌体结构施工合同模板
- 2025年度葡萄酒产区直销托运质量保障合同
- 2025版新型城镇化背景下的农村集体土地使用权买卖合同
- 2025版蔬菜出口贸易合同模板
- 2025版砂石原料采购与质量控制合同模板
- 乒乓球裁判培训课件
- 铁道概论(第八版)佟立本主编
- 真心痛的护理常规课件
- 乡村振兴项目规划建设与运营方案
- 驾驶员服务外包合同范本
- 实际控制人证明书
- 如何提高现场管理能力ppt
- 幼儿园红色小故事PPT:抗日小英雄王二小的故事
- 从力的做功到平面向量数量积说课稿省名师优质课赛课获奖课件市赛课百校联赛优质课一等奖课件
- 部编人教版四年级上册道德与法治全册教案
- 铝合金压铸控制计划模板
评论
0/150
提交评论