Qt编译zlib完成文件压缩解压(Ubuntu18.04)

2022-09-28 09:40:14 浏览数 (1)

一、前言

在软件开发中进行有需求需要将生成的一些文件打包上传到服务器,或者从服务器下载压缩包下来内部解压。或者自己做一些打包工具,那么使用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/目录下

代码语言:javascript复制
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头文件。

代码语言:javascript复制
#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相关的库拷贝到可执行文件同级目录下即可。

代码语言:javascript复制
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

0 人点赞