最近遇到了一个问题,之前向zip文件中添加的都是一个个的文件,并且都不会重名。
现在是需要按照不同目录存放相同的文件名到zip文件中,找了半天资料没有合适的,最后发现在注释中找到了答案。
为了说明这个简单的事情,我们先来学习一下InfoZip这个压缩解压库吧。
官网地址:http://infozip.sourceforge.net/ (官网包含二进制文件和源代码)
官网源码下载地址:ftp://ftp.info-zip.org/pub/infozip/src/
总结Info-ZIP就是一个免费的,跨平台的,便捷的,高质量的压缩解压库。
sourceforge项目地址:https://sourceforge.net/projects/infozip/
源码下载地址:https://sourceforge.net/projects/infozip/files/
顺便提一下,duilib开源界面库中的解压代码也是使用了这个库。
InfoZip是个不错的压缩解压库,但是使用起来可能要学习很多概念,所以我们没有直接使用,而是使用了一个封装好的库。
这个封装是由一个外国人封装的,专门为了windows封装的,这个人叫Lucian Wischik。
封装的代码在他的个人网站上可以学习和下载。
封装的代码介绍:http://www.wischik.com/lu/programmer/zip_utils.html
封装的代码下载:http://www.wischik.com/lu/programmer/zip_utils_src.zip
这个库叫ZipUtils,里头有所有的源码和使用示例。
在codeprojiect网站上也有一个介绍的文章:https://www.codeproject.com/Articles/7530/Zip-Utils-Clean-Elegant-Simple-Cplusplus-Win
ZipUtils使用方法非常简单,只需要把下面四个文件包含到工程中即可使用所有的压缩和解压的功能。非常方便。
zip.h
unzip.cpp
unzip.h
zip.cpp
下面说下我遇到的问题吧,我需要在zip文件中把文件按目录存放到zip文件中。在网上找了半天没有发现什么有用的资料,然后又回去看注释,发现原来可以这么写:
结果我立马去验证了下,发现可以。这个问题就这么解决了。截图如下:
下面是我写的很简单的测试代码供大家学习参考吧。
#include <windows.h>
#include <tchar.h>
#include "zip.h"
#include "unzip.h"
void ZipFile()
{
HZIP hz = CreateZip(_T("d:\\InfoZipTest.zip"), NULL);
if (!hz)
return;
// 添加文件
ZipAdd(hz, _T("1.txt"), _T("d:\\1.txt"));
// 同样是添加文件,但是在zip中增加一个folder目录
ZipAdd(hz, _T("folder\\1.txt"), _T("d:\\1.txt"));
CloseZip(hz);
}
void UnZipFile()
{
SetCurrentDirectory(_T("e:\\"));
HZIP hz= OpenZip(_T("d:\\InfoZipTest.zip"), 0);
if (!hz)
return;
ZIPENTRY ze;
GetZipItem(hz, -1, &ze);
int numitems = ze.index;
for (int i = 0; i < numitems; i++)
{
GetZipItem(hz, i, &ze);
UnzipItem(hz, i, ze.name);
}
CloseZip(hz);
}
int __stdcall wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)
{
ZipFile();
UnZipFile();
return 0;
}
完整代码下载:https://download.csdn.net/download/zsc_976529378/12362186
最后,闲聊一下作者吧,感兴趣查看了下作者的个人网站然后又搜索了一些资料,感觉比较NB吧,多学习学习。
这个是他家族的网站:http://www.wischik.com/
这个是他个人的网站:http://www.wischik.com/lu/
这个是他编程的页面:http://www.wischik.com/lu/programmer/
里头有很多东西,其中就包括ZipUtils库。还有一些比如屏幕保护程序,图像技术,内存管理,软件调试等技术。
Lucian Wischik按照他的个人工作介绍:http://www.wischik.com/lu/about/work.html
I am the Spec Lead for Microsoft Visual Basic in Redmond, USA.
他是微软VB语言的负责人,感觉真NB.
在这里看到了对他的一个采访:https://devblogs.microsoft.com/vbteam/community-interview-with-lucian-wischik-beth-massi/
顺带在了解下,目前市面上还有一个比较流行的压缩解压库:minizip
github地址:https://github.com/nmoinvaz/minizip
chromium源码集成地址:https://chromium.googlesource.com/external/github.com/nmoinvaz/minizip/
也很值得我们去学习。