推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

封装基于zlib的minizip库用于解压缩zip文件

   2023-07-28 网络整理佚名2630
核心提示:将基于此篇文章的描述,尝试并记录调用过程,继续改造库并开放调用接口。的调用方式可以在其源码main()函数中查看,以我的理解,在main()函数中通过对zlib库中函数的调用,实现了对于的压缩功能。为了项目中调用的更加方便,考虑将修改为动态库的调用方式。c中main函数为动态库接口函数,并新增头文件

开发过程中需要解压.zip文件的功能。 查阅资料后尝试使用开源库zlib中提供的源码。 本文记录了具体的调用实现和学习过程,方便后续问题发现和补充。

跨平台环境:C/C++/+VS/+Make/zlib-1.2.11

参考文章:

zlib官网:zlib首页使用一栏解压多个文件(基于zlib) - CSDN博客:zip压缩/解压库(zlib库的重新编译)

文章[2]对zlib有非常详细的介绍,可以对这个库有更清晰的认识。 我们将根据本文的描述尝试记录调用过程,继续改造库并开放调用接口。

1.Linux平台

下载zlib源码,这里只是压缩包格式的区别,我选择

在zlib根目录下编译得到libz.so

ross@ubuntu:~/Desktop/zlib-1.2.11$ ./configure 
ross@ubuntu:~/Desktop/zlib-1.2.11$ make

进入/目录进行编译,得到,两个执行文件

ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ make

测试并,通过命令行调用,帮助信息如下

ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./minizip -o -9 target.zip a.txt b.txt
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./miniunz -o target.zip
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./minizip
MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant
more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html
Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]
  -o  Overwrite existing file.zip
  -a  Append to existing file.zip
  -0  Store only
  -1  Compress faster
  -9  Compress better
  -j  exclude path. store only the file name.
ross@ubuntu:~/Desktop/zlib-1.2.11/contrib/minizip$ ./miniunz
MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant
more info at http://www.winimage.com/zLibDll/unzip.html
Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]
  -e  Extract without pathname (junk paths)
  -x  Extract with pathname
  -v  list files
  -l  list files
  -d  directory to extract into
  -o  overwrite files without prompting
  -p  extract crypted file using password

zlib的调用方法可以在其源码的main()函数中查看。 根据我的理解,zlib的压缩功能是在main()函数中通过调用zlib库中的函数来实现的。 (相似地)

为了在项目中调用更加方便,可以考虑修改为动态库调用方式。 (静态库同理)

修改.c,.c中的main函数为动态库接口函数,并添加新的头文件

//miniunz.h
extern int ZEXPORT unzip(filename, path)

修改文件编译成动态库(参考文章[3])

CC=cc
CFLAGS=-O2 -I../.. -shared -fPIC
MINIZIP_OBJS = ioapi.o mztools.o unzip.o zip.o miniunz.o minizip.o ../../libz.so
.c.o:
	$(CC) -c $(CFLAGS) $*.c
all: libminizip.so
libminizip.so: $(MINIZIP_OBJS)
	$(CC) $(SHARE) $(CFLAGS) -o $@ $(MINIZIP_OBJS)
clean:
	/bin/rm -f *.o *~ libminizip.so

完成上述修改后,执行make编译.so。 根据参考文章[3]中的描述,它不依赖libz.so。

以后就可以通过工程中的头文件和.so来调用上述自定义名称的压缩/解压函数了。

2. 平台

终端源码与Linux终端源码相同,提供的zlib解决方案可以在源码的zlib-1.2.11\\路径中找到。

用vs打开.sln,编译工程生成zlib动态库和静态库、.dll和.lib

编译/解压即可得到对应的执行文件。 为了方便工程调用,修改工程属性来编译生成动态库。 修改方法与Linux平台章节相同:新建头文件,将main()函数修改为导出函数。

另外,zlib源代码是用C语言编写的。 在C++项目中调用时,需要注意关键字的使用,需要添加

extern "C" {
 int unzip(char* filename, char* path);
}

此时,您可以获得.dll或.lib,可以轻松地将其集成到项目中。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON