http://www.xdp.it/去下个cxImage吧,提出你需要的部分代码就可以了
由于要用程序压缩一个文件夹,因此选用zlib库。
在zlib中的例子程序zpipe.c中,给出了如何压缩一个文件,这里稍加扩展,对一个文件夹进行压缩。
说来也简单,就是将文件夹/目录下的每个文件找到并压缩到一个文件中。
源代码如下:












































































































































































以上就是zpipe.c的几个主要函数:def()、inf()和zerr(),def()是压缩函数,主要使用了zlib的deflate()接口;inf()是压缩函数,主要使用了zlib的inflate()接口;zerr()是错误打印函数。



































































































































以上就是主要的目录压缩代码,主要是将目录/文件的名称写入后,紧跟着压缩后的数据。
这里只提供了压缩代码,解压代码也依次逆向做出;在解压的时候,有个问题:怎样知道压缩数据开始?这里提供了USE_TAG进行分隔,若诸位有更好的方法,请告诉我。
注意:这种格式并不通用,要根据你的实际格式要求进行压缩!
仅供参考。
http://blog.youkuaiyun.com/spacetiller/article/details/1867931
3.
VC中使用zlib压缩目录结构生成zip文件
注:如果对使用库没有限制的话,推荐使用另外的封装好的库更加方便,比如codeproject上可以找到的ZipUtils等(http://www.codeproject.com/KB/files/zip_utils.aspx)。
使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件。利用官方下载的zlib包中包含的contrib/minizip/zip.h和zip.c代码提供的函数,可以很容易实现这个功能。
zip.h和zip.c函数接口介绍:
1. zipOpen 打开、创建zip文件
2. zipOpenNewFileInZip 在zip文件中创建新文件
3. zipWriteInFileInZip 将数据写入zip文件中的文件里
4. zipCloseFileInZip 关闭zip文件中的文件
5. zipClose 关闭zip文件
在VC中将某个目录下的所有文件(包括子目录、空目录)压缩到一个zip文件中的代码如下:
- //code by MulinB
- //2011-04-28
-
- #define UNICODE
- #define _UNICODE
-
- #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文件
- }
http://blog.youkuaiyun.com/mulinb/article/details/6393139
4.zlib也可以在内存中对数据进行压缩和解压缩,参考:
http://hispider.googlecode.com/svn/trunk/devel/hispider/src/utils/zstream.c
注:如果对使用库没有限制的话,推荐使用另外的封装好的库更加方便,比如codeproject上可以找到的ZipUtils等(http://www.codeproject.com/KB/files/zip_utils.aspx)。
使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件。利用官方下载的zlib包中包含的contrib/minizip/zip.h和zip.c代码提供的函数,可以很容易实现这个功能。
zip.h和zip.c函数接口介绍:
1. zipOpen 打开、创建zip文件
2. zipOpenNewFileInZip 在zip文件中创建新文件
3. zipWriteInFileInZip 将数据写入zip文件中的文件里
4. zipCloseFileInZip 关闭zip文件中的文件
5. zipClose 关闭zip文件
在VC中将某个目录下的所有文件(包括子目录、空目录)压缩到一个zip文件中的代码如下:
- //code by MulinB
- //2011-04-28
- #define UNICODE
- #define _UNICODE
- #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文件
- }
http://blog.youkuaiyun.com/mulinb/article/details/6393139