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

下载本文档

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

文档简介

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

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

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

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

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

6、加一个文件到包裹 bool CPackage:AddFileToPackage( 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打包程序的实现 A

7、ddFileToPackage函数的实现 添加一个文件到包裹 /构建包裹数据 PackageItem Item; strncpy( Item.FileName, szFileName, sizeof( Item.FileName ) - 1 ); Item.FileSize = FileSize; Item.OffsetPackage = ftell( m_fpPackage ); /同样为了演示方便,我们不做任何写入判断 /先把包裹文件信息写入包裹 fwrite( /写入文件数据,我们准备一个K的缓冲区 char szBuffer65536; 第三节:Package1打包程序的实现 AddF

8、ileToPackage函数的实现 添加一个文件到包裹 while( 1 ) /读取文件 int nReadBytes = fread( szBuffer, 1, sizeof( szBuffer ), fp ); /写入包裹 fwrite( szBuffer, 1, nReadBytes, m_fpPackage ); /如果读取到的数据比缓冲区小,那么说明读取结束了 if( nReadBytes OffsetPackage + sizeof( PackageItem ), SEEK_SET ); /写入文件数据,我们准备一个K的缓冲区 char szBuffer65536; 第四节:Pac

9、kage2解包程序的实现 实现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 ); /ReadSize必

10、须要等于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、新建一个

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

12、下来我们在Package.cpp里面实现我们要解包的代码,如下 第四节:Package2解包程序的实现 1、vs2005向导生成Package2程序 2、新建一个CPackageLoader类(这个类负责解出Package1打包的文件) 3、在CPackageLaoder类中添加几个接口 4、实现打开包裹文件的OpenPackage函数 5、实现得到包裹里面有多少个PackageItemq结构的GetPackageItemCount函数 6、实现得到打包文件的信息的GetPackageItem函数 7、实现导出包裹文件并保存到szTargetName的ExportPackageItem函数 8、测试Package2解包程序 9、显示运行结果 第四节:Package2解包程序的实现 显示运行结果 编译,得到Package2.exe,然后我们要使用之前我们在Package1 工程打包得到的test.pkg文件,复制一份Package2运 行目录下,如下 第四节:Package2解包程序的实现 显示运行结果 运行package2.exe我们得到类似这样的结果: 第四节:Package2解包程序的实现 显示运行结果 在Package2.exe的运行目录,我们得到解出来的test.txt, test2.txt两个文件 打开内容,这时候我们会看到和在package1中打包进去的

温馨提示

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

评论

0/150

提交评论