一、前言
在软件开发中进行有需求需要将生成的一些文件打包上传到服务器,或者从服务器下载压缩包下来内部解压。或者自己做一些打包工具,那么使用zlib开源就可以很方便的完成。接下来介绍在zlib在Linux(Ubuntu18.04)下如何利用Qt进行编译,调用,完成zip文件打包生成例子。可以单文件压缩打包,多文件压缩打包,目录压缩打包等等。
如果需要在windows下使用zlib,请看这里: https://blog.csdn.net/xiaolong1126626497/article/details/126703153
二、开发环境
代码语言:javascript复制操作系统: Ubuntu18.04 64位
Qt版本 : Qt5.12.6
编译器 : GCC 64bit
三、编译zlib
(1)下载zlib
地址: http://www.zlib.net/
(2)解压
新建一个目录,将下载的压缩包解压到当前目录。
代码语言:javascript复制wbyq@wbyq:~/work_pc$ mkdir zlib
wbyq@wbyq:~/work_pc$ cd zlib/
wbyq@wbyq:~/work_pc/zlib$ tar xvf /home/wbyq/下载/zlib-1.2.12.tar.gz
(3)编译安装
如果想要配置安装的路径,可以用–prefix=指定,例如:--prefix=$PWD/_install
。如果不配置安装路径,默认就安装在/usr/local/
目录下
wbyq@wbyq:~/work_pc/zlib/zlib-1.2.12$ ./configure
wbyq@wbyq:~/work_pc/zlib/zlib-1.2.12$ make
wbyq@wbyq:~/work_pc/zlib/zlib-1.2.12$ sudo make install
rm -f /usr/local/lib/libz.a
cp libz.a /usr/local/lib
chmod 644 /usr/local/lib/libz.a
cp libz.so.1.2.12 /usr/local/lib
chmod 755 /usr/local/lib/libz.so.1.2.12
rm -f /usr/local/share/man/man3/zlib.3
cp zlib.3 /usr/local/share/man/man3
chmod 644 /usr/local/share/man/man3/zlib.3
rm -f /usr/local/lib/pkgconfig/zlib.pc
cp zlib.pc /usr/local/lib/pkgconfig
chmod 644 /usr/local/lib/pkgconfig/zlib.pc
rm -f /usr/local/include/zlib.h /usr/local/include/zconf.h
cp zlib.h zconf.h /usr/local/include
chmod 644 /usr/local/include/zlib.h /usr/local/include/zconf.h
四、编译quazip
(1)下载quazip
下载地址: https://sourceforge.net/projects/quazip/
(2)解压
和刚才的zlib一样,下载后解压。
代码语言:javascript复制wbyq@wbyq:~/work_pc/zlib$ unzip /mnt/hgfs/linux-share-dir/quazip-0.7.3.zip
### (3)配置项目
quazip-0.7.3是一个Qt工程,双击打开pro文件即可。
打开quazip.pro
文件,删除 SUBDTRS
后面的qztest
打开pro文件,加上zlib库引用
代码语言:javascript复制LIBS = -lz
因为刚才编译zlib之后,直接将文件安装到系统用户目录下了,这里就不用去指定路径。
(4) 编译
配置完毕后,点击左下角的锤子
按钮进行构建项目。
在构建目录下可以看到生成的动态库。
为了方便接下来的使用,将生成的动态库文件和头文件拷贝到/usr/local/lib/
和/usr/local/include/
目录下。
拷贝库文件: (拷贝时。cp命令后加上-d选项,保留文件之间的链接关系)
代码语言:javascript复制wbyq@wbyq:~/work_pc/zlib/build-quazip-Desktop_Qt_5_12_6_GCC_64bit-Release/quazip$ ls
libquazip.so libquazip.so.1 libquazip.so.1.0 libquazip.so.1.0.0 Makefile
wbyq@wbyq:~/work_pc/zlib/build-quazip-Desktop_Qt_5_12_6_GCC_64bit-Release/quazip$ sudo cp *.so* /usr/local/lib/ -d
拷贝头文件:
代码语言:javascript复制wbyq@wbyq:~/work_pc/zlib/quazip-0.7.3/quazip$ pwd
/home/wbyq/work_pc/zlib/quazip-0.7.3/quazip
wbyq@wbyq:~/work_pc/zlib/quazip-0.7.3/quazip$ ls
CMakeLists.txt JlCompress.h quacrc32.h quazipdir.cpp quazip_global.h quazip.sln unzip.h
crypt.h qioapi.cpp quagzipfile.cpp quazipdir.h quazip.h quazip.vcproj zip.c
debian quaadler32.cpp quagzipfile.h quazipfile.cpp quazipnewinfo.cpp quazip.vcxproj zip.h
doc quaadler32.h quaziodevice.cpp quazipfile.h quazipnewinfo.h quazip.vcxproj.filters
ioapi.h quachecksum32.h quaziodevice.h quazipfileinfo.cpp quazip.pri run_moc.bat
JlCompress.cpp quacrc32.cpp quazip.cpp quazipfileinfo.h quazip.pro unzip.c
wbyq@wbyq:~/work_pc/zlib/quazip-0.7.3/quazip$ sudo cp *.h /usr/local/include/
五、新建项目测试文件压缩
(1)新建一个Qt工程
(2)修改Pro文件
在Pro文件里引入库文件:
代码语言:javascript复制LIBS = -lquazip
(3)压缩方法
在工程里引用JlCompress.h
头文件。
#include "JlCompress.h"
常用的静态压缩方法:
代码语言:javascript复制static bool compressDir(QString fileCompressed, QString dir,
bool recursive, QDir::Filters filters);
static bool compressFile(QString fileCompressed, QString file);
static bool compressFiles(QString fileCompressed, QStringList files);
引用示例:
代码语言:javascript复制JlCompress::compressDir(); //压缩目录
JlCompress::compressFile(); //压缩文件
JlCompress::compressFiles(); //压缩文件列表
(4)编写测试Demo
代码语言:javascript复制error while loading shared libraries: libquazip.so.1: cannot open shared object file: No such file or directory
运行时如果提示找不到libquazip
库,将libquazip
相关的库拷贝到可执行文件同级目录下即可。
wbyq@wbyq:~/qt_code/build-zlib_Demo-Desktop_Qt_5_12_6_GCC_64bit-Release$ cp /home/wbyq/work_pc/zlib/build-quazip-Desktop_Qt_5_12_6_GCC_64bit-Release/quazip/*.so* ./ -d
Demo运行效果:
选择待压缩的文件:
选择成功,开始压缩:
压缩成功:
六、源代码
说明: 这是测试的Demo,代码里没有使用线程。压缩的时候比较耗费时间,如果文件多UI界面会无响应。正式使用,放到子线程里即可。
(1)widget.cpp
代码语言:javascript复制#include "widget.h"
#include "ui_widget.h"
#include "JlCompress.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
//选择压缩的文件列表
void Widget::on_pushButton_select_clicked()
{
filenamelist=QFileDialog::getOpenFileNames(this,"选择待压缩的文件","C:/",tr("*.*"));
if(filenamelist.size()<=0)return;
QString file_file;
for(int i=0;i<filenamelist.count();i )
{
file_file =filenamelist.at(i) "rn"; //循环取出列表中的文件名称
}
ui->plainTextEdit->setPlainText(file_file);
}
//开始压缩打包
void Widget::on_pushButton_start_clicked()
{
QString filename=QFileDialog::getSaveFileName(this,"压缩后文件名称","C:/",tr("*.zip"));
if(filename.isEmpty())return;
bool state=JlCompress::compressFiles(filename,filenamelist); //压缩文件列表
if(state)
{
ui->lineEdit->setText("压缩成功:" filename);
}
else
{
ui->lineEdit->setText("压缩失败.");
}
}
(2)widget.h
代码语言:javascript复制#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFileDialog>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_select_clicked();
void on_pushButton_start_clicked();
private:
Ui::Widget *ui;
QStringList filenamelist;
};
#endif // WIDGET_H