1. //测试通过 科嵌电子
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. typedef unsigned int  uint;
  6. typedef unsigned char byte;
  7. // 包文件中最大可容纳的文件个数
  8. #define MAX_FILE_COUNT 10
  9. // 全局包文件指针
  10. FILE*  g_pMasFile = NULL;
  11. // 资源包文件头结构
  12. typedef struct SMaseFileHeader
  13. {
  14. uint  uFileFlag;         // 包文件头标记: 'MASE'
  15. uint  uFileCount;        // 包内文件个数
  16. uint  uFileListOfs;      // 文件列表偏移
  17. uint  uMaxFileCount;     // 最大子文件个数
  18. uint  uFileSize;         // 包文件的大小
  19. }MaseHeader;
  20. // 包内文件信息结构
  21. typedef struct SFilesMessage
  22. {
  23. uint  uFileOfs;          // 本文件在包内的偏移
  24. uint  uFileSize;         // 本文件的大小
  25. char  szFileName[260];   // 本文件的路径
  26. }FilesMsg;
  27. // 打开包文件
  28. int OpenMasFile(const char* path, const byte onlyOpen)
  29. {
  30. uint       uWriteCount;       // 写入文件信息次数
  31. byte       bIsNew = 0;        // 是否新建的
  32. MaseHeader header;            // 文件头结构定义
  33. FilesMsg   msg;               // 文件信息结构定义
  34. g_pMasFile = fopen(path, "rb");  // 用来判断是否存在
  35. if (g_pMasFile == NULL)
  36. {
  37. if (onlyOpen == 1)            // 只打开不新建
  38. return -1;
  39. bIsNew = 1;
  40. g_pMasFile = fopen(path, "wb");
  41. if (g_pMasFile == NULL)
  42. return -1;
  43. }
  44. //先关闭,然后在用"rb+"方式打开  二进制读写打开文件
  45. fclose( g_pMasFile );
  46. g_pMasFile = fopen(path, "rb+");
  47. if (g_pMasFile == NULL)
  48. return -1;
  49. if(bIsNew == 1)// 新建的文件
  50. {
  51. header.uFileFlag     = 'ESAM';
  52. header.uFileCount    = 0;
  53. header.uFileListOfs  = sizeof(MaseHeader); //紧跟着就是文件列表
  54. header.uMaxFileCount = MAX_FILE_COUNT;
  55. header.uFileSize     = sizeof(MaseHeader)
  56. + (MAX_FILE_COUNT * sizeof(FilesMsg));
  57. //写入头信息
  58. fwrite(&header, sizeof(MaseHeader), 1, g_pMasFile);
  59. memset(&msg, 0, sizeof(FilesMsg));
  60. uWriteCount = MAX_FILE_COUNT;
  61. //写入文件列表用0占位
  62. while(uWriteCount--)
  63. fwrite(&msg, sizeof(FilesMsg), 1, g_pMasFile);
  64. }
  65. else//文件存在
  66. {
  67. //则读取头文件信息
  68. fread(&header, sizeof(MaseHeader), 1, g_pMasFile);
  69. }
  70. //检查文件头标记
  71. if (header.uFileFlag != 'ESAM')
  72. {
  73. fclose(g_pMasFile);
  74. printf("文件头标记不对,错误!\n");
  75. return -1;
  76. }
  77. //检查数据是否完整
  78. if (header.uMaxFileCount != MAX_FILE_COUNT)
  79. {
  80. fclose(g_pMasFile);
  81. printf("数据不完整,错误!\n");
  82. return -1;
  83. }
  84. return 0;
  85. }
  86. //写文件到包里
  87. int WriteFileToPak(const char* path)
  88. {
  89. FilesMsg   fileMsg;      //此文件的文件信息结构
  90. MaseHeader header;       //包文件头结构定义
  91. uint       uFileSize;
  92. uint       uFileListEndOfs;
  93. byte*      pBuff;
  94. FILE*      pFile = NULL;
  95. if (g_pMasFile == NULL)
  96. return -1;
  97. memset(&fileMsg, 0, sizeof(FilesMsg));
  98. fseek(g_pMasFile, 0, SEEK_SET);    //定位到文件头,读取头文件信息
  99. //则读取头文件信息
  100. fread(&header,sizeof(MaseHeader), 1, g_pMasFile);
  101. uFileListEndOfs = header.uFileCount * sizeof(FilesMsg) + header.uFileListOfs;
  102. pFile = fopen(path, "rb");
  103. if(pFile == NULL)
  104. return -1;
  105. fseek(pFile, 0, SEEK_END);
  106. uFileSize = ftell(pFile);
  107. fseek(pFile, 0, SEEK_SET);
  108. //文件名长度不能超过260
  109. strcpy(fileMsg.szFileName,path);
  110. fileMsg.uFileOfs  = header.uFileSize;
  111. fileMsg.uFileSize = uFileSize;
  112. // 写入文件信息
  113. // 将文件指针定位到uFileListEndOfs处,以便写入新的文件信息结构
  114. fseek(g_pMasFile, uFileListEndOfs, SEEK_SET);
  115. fwrite(&fileMsg,sizeof(FilesMsg),1,g_pMasFile);
  116. // 申请空间
  117. pBuff = (byte*)malloc(uFileSize);
  118. fread(pBuff,uFileSize,1,pFile);
  119. // 写数据到包文件里
  120. fseek(g_pMasFile,header.uFileSize,SEEK_SET);
  121. fwrite(pBuff, uFileSize, 1, g_pMasFile);
  122. // 释放内存
  123. free(pBuff);
  124. //重新填充header
  125. header.uFileCount += 1;
  126. header.uFileSize  += uFileSize;
  127. fseek( g_pMasFile,0,SEEK_SET);
  128. // 重新写入包文件头
  129. fwrite(&header,sizeof(MaseHeader),1,g_pMasFile);
  130. return 0;
  131. }
  132. //从包文件里读数据
  133. int ReadFileFromPak(const FilesMsg msg, byte* _dst)
  134. {
  135. if ( g_pMasFile == NULL )
  136. return -1;
  137. fseek(g_pMasFile, msg.uFileOfs,SEEK_SET);
  138. fread(_dst, msg.uFileSize, 1, g_pMasFile);
  139. return 0;
  140. }
  141. //获取包中某个文件的信息
  142. int GetFileMessage( const char* path, FilesMsg* msg)
  143. {
  144. FilesMsg   fileMsg;      // 此文件的文件信息结构
  145. MaseHeader header;       // 包头结构
  146. uint       uFileCount;   // 文件个数
  147. if ( g_pMasFile == NULL || msg == NULL )
  148. return -1;
  149. // 则读取头文件信息
  150. fseek(g_pMasFile, 0, SEEK_SET);
  151. fread(&header, sizeof(MaseHeader), 1, g_pMasFile);
  152. uFileCount = header.uFileCount;
  153. while (uFileCount--)
  154. {
  155. fread(&fileMsg, sizeof(FilesMsg), 1,g_pMasFile);
  156. // 判断是否是要获取的文件
  157. if (stricmp(fileMsg.szFileName, path) == 0 )
  158. {
  159. *msg = fileMsg;
  160. return 0;
  161. }
  162. }
  163. return -1;
  164. }
  165. // 关闭包文件
  166. int CloseMasFile( void )
  167. {
  168. if ( g_pMasFile == NULL )
  169. return -1;
  170. fclose( g_pMasFile );
  171. g_pMasFile = NULL;
  172. return 0;
  173. }
  174. //这是打包主函数
  175. int main( void )
  176. {
  177. int ret;
  178. ret = OpenMasFile( "E:\\PhotoPak.bin",0);
  179. if ( ret == -1 )
  180. goto __exit;
  181. WriteFileToPak( "E:\\珍贵.jpg" );
  182. WriteFileToPak( "E:\\123.docx" );
  183. WriteFileToPak( "E:\\456.txt" );
  184. __exit:
  185. CloseMasFile();
  186. return 0;
  187. }
  188. //查看打包中的文件,并且可以解包查看
  189. int main( void )
  190. {
  191. byte*       pBuff;
  192. FILE*       pOutFile;
  193. FilesMsg    getFileMsg;
  194. int         ret;
  195. ret = OpenMasFile("E:\\PhotoPak.bin", 1);
  196. if (ret == -1)
  197. goto __exit;
  198. ret = GetFileMessage("E:\\123.docx", &getFileMsg);
  199. if(ret == -1)
  200. goto __exit;
  201. pBuff = (byte*)malloc(getFileMsg.uFileSize);
  202. ret = ReadFileFromPak(getFileMsg, pBuff);
  203. if(ret == -1)
  204. goto __exit_free;
  205. pOutFile = fopen("E:\\123_out.docx", "wb");  // 注意使用的是二进制模式
  206. if(ret == -1)
  207. goto __exit_free;
  208. fwrite( pBuff, getFileMsg.uFileSize, 1, pOutFile );
  209. fclose( pOutFile );
  210. __exit_free:
  211. free( pBuff );
  212. __exit:
  213. CloseMasFile();
  214. return 0;
  215. }

转载于:https://blog.51cto.com/591819849/1101479

C语言打包解包文件程序(简易版)相关推荐

  1. [Shell命令] tar -cvf -xvf 打包解包文件夹

    需求背景:想要把文件发送到指定机器,但是文件所在服务器linux环境不允许直接连接,需要堡垒机 打包文件夹 test,命名为test.tar tar -cvf test.tar test/ 解包文件夹 ...

  2. 下载c语言软件后怎么解压,手机怎么解压文件 盘点常用手机压缩打包解压文件应用...

    手机现在是我们必不可少的工具,在下载应用的时候,众多网站已经把安装文件独立好了等我们去下载,但是如果你要把文件打包或者下载了网络上已经被打包压缩好的文件需要解压缩的时候,就会觉得很麻烦了,手机上可没有 ...

  3. asar软件包linux,ASAR文件查看打包解包工具下载-ASAR文件查看打包解包工具v2018.07.12免费版-ucbug软件站...

    ASAR文件查看打包解包工具是一款能够帮助用户对ASAR文件进行管理的工具,通过ASAR文件查看打包解包工具能够对文件进行查看.打包.解包等功能,有需要的可以下载使用. 功能介绍 electron的a ...

  4. Android 系统(137)---android打包解包boot.img,system.img

    android打包解包boot.img,system.img 2017年04月28日 15:00:36 阅读数:1822 原帖地址:http://www.52pojie.cn/thread-48802 ...

  5. Mtk Android 打包解包*.img

    打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...

  6. Android 系统(138 )---Mtk平台 Android 打包解包*.img ,修改system.img 参数

    Mtk平台 Android 打包解包*.img ,修改system.img 参数 MTK 升级包文件如下: 若存在软件版本号存在错误或需要修改,重新编译则需要几个小时,或者要几天的测试 若可以直接修改 ...

  7. 自定义8583模板,打包解包,使用j8583包

    j8583_boss.xml <?xml version="1.0" encoding="UTF-8"?> <?xml version=&qu ...

  8. 自定义8583模板,打包解包,使用j8583包有改动

    j8583_boss.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE j8583-c ...

  9. Debian 二进制文件(华文宋体字体)打包解包

    导读 给大家介绍一下Debian 二进制文件(华文宋体字体)打包解包. 1 准备工作 debian 字体下载链接: https://pan.baidu.com/s/1gzoxV88Pdz3MCc_Wt ...

最新文章

  1. 我的第二故乡 - 长沙
  2. 『报告』IDC:2018年物联网产业10大预测
  3. 《信息检索导论》第三章总结
  4. python语法怎么读-python怎么读sql数据?
  5. 矩阵分析与多元统计12 0-1矩阵 交换矩阵与Kronecker乘积
  6. 网工协议基础(4)TCP/UDP协议
  7. 相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)
  8. 使用ultramon调整任务栏高度
  9. Github 上 36 个最实用的 Vue 开源库
  10. 当博客系统遇上live2d后
  11. JAVA SE 基础复习-基本程序设计(1)
  12. 顺丰不行了吗?对快递行业的深度理解
  13. vue判断列表中包含某一项_判断字符串中是否包含某个字符串
  14. ----函数句柄/时间表
  15. 显卡能力在cod7上的排名
  16. 计算机游戏蜘蛛纸牌如何还原,经典PC纸牌游戏空当接龙、蜘蛛纸牌等登陆iOS/Android...
  17. 行业发展 | 雷达信号处理领域面临的重大问题
  18. 手电筒安卓_开号以来安卓软件汇总!
  19. mongodb敏感数据加解密
  20. 免费https证书生成

热门文章

  1. C语言字符输出格式化
  2. 使用Python作为计算器
  3. python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...
  4. 养不教 父母之过:10个不能靠老师解决的孩子教育问题
  5. 能让你成为更优秀程序员的10个C语言资源
  6. jws 方式表格导出,excel文件导出,rest风格接口实现
  7. 狗窝里的小日子- 5 ...
  8. Jquery Datatable的使用样例(ssm+bootstrsp框架下)服务器端分页
  9. FreeSql (八)插入数据时指定列
  10. [CF893F]Subtree Minimum Query