关闭

C++ zip文件的解压与压缩

标签: C++压缩文件解压文件
4947人阅读 评论(1) 收藏 举报

1、下载解压文件的库http://download.csdn.net/detail/yimengchenxi/8887025

2、在项目中添加相关文件

在Debug中添加zlib1.dll文件,其他文件加载到项目中

3、实现的代码

#pragma comment(lib,"zlib1")

//压缩文件
int Compress(char * DestName, const char *SrcName)
{
 char SourceBuffer[102400] = { 0 };  //压缩文件时的源buffer

 FILE* fp;  //打开欲压缩文件时文件的指针
 FILE* fp1;  //创建压缩文件时的指针
 errno_t err; //错误变量的定义
 err = fopen_s(&fp, SrcName, "r+b");
 //获取文件长度
 long cur = ftell(fp);
 fseek(fp, 0L, SEEK_END);
 long fileLength = ftell(fp);
 fseek(fp, cur, SEEK_SET);


 //读取文件到buffer
 fread(SourceBuffer, fileLength, 1, fp);
 fclose(fp);

 //压缩buffer中的数据
 uLongf SourceBufferLen = 102400;
 char* DestBuffer = (char*)::calloc((uInt)SourceBufferLen, 1);
 err = compress((Bytef*)DestBuffer, (uLongf*)&SourceBufferLen, (const Bytef*)SourceBuffer, (uLongf)fileLength);
 if (err != Z_OK)
 {
  cout << "压缩失败:" << err << endl;
  return 1;
 }

 //创建一个文件用来写入压缩后的数据
 err = fopen_s(&fp1, DestName, "w+b");
 if (!fp1)
 {
  printf("压缩文件创建失败! \n");
  return 1;
 }

 fwrite(DestBuffer, SourceBufferLen, 1, fp1);
 cout << "压缩结束" << endl;
 fclose(fp1);
 return 0;
}


//解压缩文件
int UnCompress(char * DestName, const char *SrcName)
{
 char uSorceBuffer[102400] = { 0 };  //解压缩文件时的源buffer
 FILE* fp3;  //打开欲解压文件的文件指针
 FILE* fp4;  //创建解压文件的文件指针
 errno_t err; //错误变量的定义
 //打开欲解压的文件
 err = fopen_s(&fp3, SrcName, "r+b");
 if (err)
 {
  printf("文件打开失败! \n");
  return 1;
 }

 //获取欲解压文件的大小
 long ucur = ftell(fp3);
 fseek(fp3, 0L, SEEK_END);
 long ufileLength = ftell(fp3);
 fseek(fp3, ucur, SEEK_SET);


 //读取文件到buffer
 fread(uSorceBuffer, ufileLength, 1, fp3);
 fclose(fp3);

 uLongf uDestBufferLen = 1024000;//此处长度需要足够大以容纳解压缩后数据
 char* uDestBuffer = (char*)::calloc((uInt)uDestBufferLen, 1);
 //解压缩buffer中的数据
 /*
 int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
 uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。
 sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二
 个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest
 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解
 压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求
 在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大
 小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数
 退出后, destLen 是解压出来的数据的实际大小。
 */
 err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength);

 if (err != Z_OK)
 {
  cout << "解压缩失败:" << err << endl;
  return 1;
 }

 //创建一个文件用来写入解压缩后的数据
 err = fopen_s(&fp4, DestName, "wb");
 if (err)
 {
  printf("解压缩文件创建失败! \n");
  return 1;
 }

 //printf("写入数据... \n");
 cout << "解压数据成功!" << endl;

 /*
 size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream );
 这是fwrite的MSDN标准参数表,其中buffer是需要向文件中写入的内容在内存中的首地址指针,
 size是待写入内容的每个元素的字节数,count是要写多少个元素,stream 是文件指针
 */
 fwrite(uDestBuffer, uDestBufferLen, 1, fp4);
 //cout << uDestBuffer << endl;
 fclose(fp4);
 return 0;
}





0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49808次
    • 积分:1146
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:10篇
    • 译文:0篇
    • 评论:3条
    最新评论