文件打包技术详解-第一讲_第1页
文件打包技术详解-第一讲_第2页
文件打包技术详解-第一讲_第3页
文件打包技术详解-第一讲_第4页
文件打包技术详解-第一讲_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文件打包技术详解 第一讲:打包与解包的价值与意义 主讲人:步磊峰 UIPower 3D界面引擎负责人,第一节:打包的相关概念,打包的定义 什么是打包?打包这个词很形象,就是把零碎的文件进行统一重封装,统一管理,比如我们常见的 RAR文件,ZIP文件都是很常见的包裹格式,2,第一节:打包的相关概念,打包的意义 比如RAR包,我们虽然能有工具解压,但是我们却基本上没有相关的SDK来做二次开发 ZIP包虽然有SDK来读取,但是对于通用的文件格式,我们无法做到保护资源的需求 如果只是为了文件管理的方便,无所谓别人解开资源的话,直接用现成的ZIP开发的SDK即可,3,第一节:打包的相关概念,打包的方式

2、分类打包 比如图片资源打一个包,声音资源打一个包 全部打包 把所有资源一起打包,4,第一节:打包的相关概念,打包的一般准则和规范 原始文件的标识,这个标识可以使原始文件名+路径名,或者也可以是转换后的数据如ID等,先从最简单的说 起,使用原始文件名+路径名 2.原始文件的大小,把文件打进包裹之后,我们要知道这个原始文件有多大 3.原始文件的数据打包在包裹的什么位置,5,第二节:向导生成控制台Package1程序,打开VS2008相关编辑器 选择项目win32类型 选择Win32控制台应用程序 选择控制台应用程序 点击完成按钮,6,第三节:Package1打包程序的实现,1、包裹文件的定义 2、

3、添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 3、CreatePackage(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运行结果显示,7,第三节:Package1打包程序的实现,包裹文件的定义 我们在Package.h加入最简单的包裹文件定义:,8,第三节:Package1打包程序的实现,1、包裹文件的定义 2、添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 3、CreatePackag

4、e(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运行结果显示,9,第三节:Package1打包程序的实现,添加CreatPackage函数、AddFileToPackage函数,10,第三节:Package1打包程序的实现,1、包裹文件的定义 2、添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 3、CreatePackage(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运

5、行结果显示,第三节:Package1打包程序的实现,CreatePackage函数的实现 创建空白包裹,第三节:Package1打包程序的实现,1、包裹文件的定义 2、添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 3、CreatePackage(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运行结果显示,第三节:Package1打包程序的实现,AddFileToPackage函数的实现 添加一个文件到包裹 bool CPackage:AddFileTo

6、Package( const char*szFileName ) /演示方便,我们不做任何重复性重名判断 /打开目标文件 FILE*fp = fopen( szFileName, rb ); if( !fp ) printf( 打开文件%s失败n, szFileName ); return false; /我们先得到下这个文件大小 fseek( fp, 0, SEEK_END ); int FileSize = ftell( fp ); fseek( fp, 0, SEEK_SET );,第三节:Package1打包程序的实现,AddFileToPackage函数的实现 添加一个文件到包裹 /

7、构建包裹数据 PackageItem Item; strncpy( Item.FileName, szFileName, sizeof( Item.FileName ) - 1 ); Item.FileSize = FileSize; Item.OffsetPackage = ftell( m_fpPackage ); /同样为了演示方便,我们不做任何写入判断 /先把包裹文件信息写入包裹 fwrite( ,第三节:Package1打包程序的实现,AddFileToPackage函数的实现 添加一个文件到包裹 while( 1 ) /读取文件 int nReadBytes = fread( sz

8、Buffer, 1, sizeof( szBuffer ), fp ); /写入包裹 fwrite( szBuffer, 1, nReadBytes, m_fpPackage ); /如果读取到的数据比缓冲区小,那么说明读取结束了 if( nReadBytes sizeof( szBuffer ) ) break; ,第三节:Package1打包程序的实现,AddFileToPackage函数的实现 添加一个文件到包裹 /fflush是确保我们的数据写入到磁盘上了 fflush( m_fpPackage ); /关闭文件 fclose( fp ); return true; ,第三节:Pack

9、age1打包程序的实现,1、包裹文件的定义 2、添加CreatPackage(创建空白包裹)函数、AddFileToPackage(添加一个文件到包裹)函数 3、CreatePackage(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运行结果显示,第三节:Package1打包程序的实现,测试所编写的打包程序 好了,我们完成了最最简单的一个包裹类了,接下来我们就看看怎么来打一个简单的包,第三节:Package1打包程序的实现,1、包裹文件的定义 2、添加CreatPackage(创建空白包裹)函数、AddFileT

10、oPackage(添加一个文件到包裹)函数 3、CreatePackage(创建空白包裹)函数的实现 4、AddFileToPackage(添加一个文件到包裹)函数的实现 5、测试所编写的打包程序 6、运行结果显示,第三节:Package1打包程序的实现,运行结果显示 编译,得到package1.exe之后,我们随便添加2个文本文件test.txt, test2.txt到exe相同目录下,运行exe之后,我们成 功得到一个文件test.pkg,这样最简单的包裹就打好了,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader

11、类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,vs2008向导生成Package2程序 打开VS2008相关编辑器 选择项目win32类型 选择W

12、in32控制台应用程序 选择控制台应用程序 点击完成按钮,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试

13、Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,新建一个CPackageLoader类 这个类负责解出Package1打包的文件,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem

14、函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,在CPackageLaoder类中添加几个接口 为了能读取我们刚才的包裹,我们需要把Package1工程定义的PackageItem定义给复制过来,再添加几个接口,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文

15、件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,实现打开包裹文件的OpenPackage函数 包裹的构成,是由PackageItem固定信息+文件内容构成,所以我们只需要读取PackageItem的内容,就知道每个打包 文件的详细信息,第四节:Package2解包程

16、序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,实现

17、GetPackageItemCount函数 得到包裹里面有多少个PackageItemq结构,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的Export

18、PackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,实现得到打包文件的信息的GetPackageItem函数,第四节:Package2解包程序的实现,1、vs2008向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPacka

19、geItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,实现ExportPackageItem函数 导出包裹文件并保存到szTargetName bool CPackageLoader:ExportPackageItem( const PackageItem*pItem, const char*szTargetName ) /为了演示,我们这里去掉了m_fpPackage合法性判断, pItem合法性判断和szTargetName的判断 FILE*

20、fp = fopen( szTargetName, wb ); if( !fp ) printf( 打开%s失败n, szTargetName ); return false; /移动文件指针到指定位置,由于我们的OffsetPackage数据包含了PackageItem信息 /所以打包文件的真实偏移还需要加上sizeof( PackageItem ) fseek( m_fpPackage, pItem-OffsetPackage + sizeof( PackageItem ), SEEK_SET ); /写入文件数据,我们准备一个K的缓冲区 char szBuffer65536;,第四节:P

21、ackage2解包程序的实现,实现ExportPackageItem函数 /我们需要读取的文件大小 int LeftSize = pItem-FileSize; while( 1 ) /实际要读取的大小 int ReadSize = LeftSize; /如果大于缓冲区,我们就只读取缓冲区大小的内容,剩余的下次读取 if( ReadSize sizeof( szBuffer ) ) ReadSize = sizeof( szBuffer ); /读取文件 int nReadBytes = fread( szBuffer, 1, ReadSize, m_fpPackage ); /ReadSiz

22、e必须要等于nReadBytes,演示代码我们不做过多判断 assert( ReadSize = nReadBytes );,第四节:Package2解包程序的实现,实现ExportPackageItem函数 /写入包裹 fwrite( szBuffer, 1, nReadBytes, fp ); LeftSize -= nReadBytes; /如果剩余大小为,就读取完成了 if( LeftSize = 0 ) break; /wile循环结束 fclose( fp ); return true; ,第四节:Package2解包程序的实现,1、vs2005向导生成Package2程序 2、新

23、建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果,第四节:Package2解包程序的实现,测试Package2解包程序 我们第一个例子的解包完整代码就在这里了,接下来我们在Package.cpp里面实现我们要解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论