使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件,如何在程序中实现压缩和解压缩整个目录的功能。

2011-01-04 04:30:06

1 Answers

今天要实现协议解析,同时要解压错zip文件,而且zip是针对目录压缩的,所以要解压缩到特定目录中,自己把这个问题已经解决了。

在codeproject找到一个事例,用后自己有重新封装了下,封装成一个函数。
[http://www.codeproject.com/KB/files/zip_utils.aspx][1]

#include <atlconv.h> //for W2CA #include "zlib/contrib/minizip/zip.h" //最终接口:从某个目录创建zip文件 void CreateZipFromDir(const CString& dirName, const CString& zipFileName); //将文件添加到zip文件中,注意如果源文件srcFile为空则添加空目录 //fileNameInZip: 在zip文件中的文件名,包含相对路径 void AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile) { FILE* srcfp = NULL; //初始化写入zip的文件信息 zip_fileinfo zi; zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; zi.dosDate = 0; zi.internal_fa = 0; zi.external_fa = 0; //如果srcFile为空,加入空目录 char new_file_name[MAX_PATH]; memset(new_file_name, 0, sizeof(new_file_name)); strcat(new_file_name, fileNameInZip); if (srcFile == NULL) { strcat(new_file_name, "/"); } //在zip文件中创建新文件 zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); if (srcFile != NULL) { //打开源文件 srcfp = fopen(srcFile, "rb"); if (srcfp == NULL) { MessageBox(_T("无法添加文件") + CString(srcFile) + _T("!")); zipCloseFileInZip(zf); //关闭zip文件 return; } //读入源文件并写入zip文件 char buf[100*1024]; //buffer int numBytes = 0; while( !feof(srcfp) ) { numBytes = fread(buf, 1, sizeof(buf), srcfp); zipWriteInFileInZip(zf, buf, numBytes); if( ferror(srcfp) ) break; } //关闭源文件 fclose(srcfp); } //关闭zip文件 zipCloseFileInZip(zf); } //递归添加子目录到zip文件 void CollectFilesInDirToZip(zipFile zf, const CString& strPath, const CString& parentDir) { USES_CONVERSION; //for W2CA CString strRelativePath; CFileFind finder; BOOL bWorking = finder.FindFile(strPath + _T("//*.*")); while(bWorking) { bWorking = finder.FindNextFile(); if(finder.IsDots()) continue; if (parentDir == _T("")) strRelativePath = finder.GetFileName(); else strRelativePath = parentDir + _T("//") + finder.GetFileName(); //生成在zip文件中的相对路径 if(finder.IsDirectory()) { AddFileToZip(zf, W2CA(strRelativePath), NULL); //在zip文件中生成目录结构 CollectFilesInDirToZip(zf, finder.GetFilePath(), strRelativePath); //递归收集子目录文件 continue; } AddFileToZip(zf, W2CA(strRelativePath), W2CA(finder.GetFilePath())); //将文件添加到zip文件中 } } //最终接口:从某个目录创建zip文件 void CreateZipFromDir(const CString& dirName, const CString& zipFileName) { USES_CONVERSION; //使用W2CA转换unicode字符集 zipFile newZipFile = zipOpen(W2CA(zipFileName), APPEND_STATUS_CREATE); //创建zip文件 if (newZipFile == NULL) { MessageBox(_T("无法创建zip文件!")); return; } CollectFilesInDirToZip(newZipFile, dirName, _T("")); zipClose(newZipFile, NULL); //关闭zip文件 }

2011-01-04 06:49:21
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制