在linux系统中,经常用到tar.gz格式进行压缩,许多搭建在linux服务器上的升级文件必须为tar.gz格式。为了方便文件压缩,故想到通过Qt制作安装包工具,在windows下按照自定义格式进行文件打包压缩。
而在windows下进行压缩,需要借助7z压缩工具:https://www.7-zip.org/download.html
通过调用7z命令来进行压缩,如上图所示,除命令行工具外,当然也有源码和sdk,有兴趣可以自行研究 。下面仅介绍最简单的方法-------通过调用7z命令实现文件压缩。
一、7z工具包下载下来后,首先通过dos命令查看其用法。
进入解压目录,输入7za.exe --help,查看命令用法。
7za.exe主要用到如下几个参数:
二、QT调用7z命令压缩
命令行通过如下命令,可次直接将文件夹test打包成test.tar.gz文件。
# 7za.exe a -ttar -so test.tar test/* | 7za.exe a -si test.tar.gz
但是通过QProcess 调用该命令如法实现功能,猜测可能是windows Qt不支持管道命令 | (若有大佬一步实现压缩,欢迎留言),所以QT进行tar.gz压缩时需要分两步来进行,首先通过tar归档文件为.tar文件,然后通过gzip将.tar文件压缩为.tar.gz文件。
三、调用7za.exe相关代码如下:
QProcess *process = NULL;
//QString cmd_format = "7za.exe --help"; //测试能够调用7za.exe命令
QString cmd_format = "7za.exe a -ttar service.tar \""; //生成归档文件
cmd_format += ui->service_update_dir->text(); //通过QFileDialog选择的目录
cmd_format += "/*"; //目录下的所有文件
qDebug()<<"cmd = "<<cmd_format;
process = new QProcess(this);
process->start(cmd_format); //压缩为service.tar
process->waitForFinished(); //等待执行完成
qDebug()<<"Result:"<<process->readAll();
cmd_format = "7za.exe a -tgzip "; //生成gz文件
cmd_format += ui->service_output_dir->text(); //gz文件生成目录
cmd_format += "/service.tar.gz";
cmd_format += " service.tar";
qDebug()<<"cmd = "<<cmd_format;
process->start(cmd_format);
process->waitForFinished(); //等待执行完成
qDebug()<<"Result:"<<process->readAll();
process->deleteLater();
QFile::remove("service.tar"); //删除中间归档文件
运行时需要将7za.exe程序及dll拷贝至工程目录下,否则无法执行7za.exe命令。如图所示: