qt集成ziplib压缩文件和目录「建议收藏」

qt集成ziplib压缩文件和目录「建议收藏」今天本来想完成压缩文件的任务 结果并没有想象中那么轻松 1 qt 自带有压缩工具 但是不考虑 因为 qCompress 主要用来压缩字节流 就算自己封装成压缩文件 也只能用 qt 的接口进行解压 可项目需要的是一个通用的压缩工具 2 zlib quazip zlib 官网 http www zlib net quazip 参考 http quazip sourceforge

今天本来想完成压缩文件的任务,结果并没有想象中那么轻松,

1.qt自带有压缩工具,但是不考虑,因为qCompress主要用来压缩字节流,就算自己封装成压缩文件,也只能用qt的接口进行解压,可项目需要的是一个通用的压缩工具,

2.zlib+quazip

zlib官网:http://www.zlib.net/

quazip参考 http://quazip.sourceforge.net/classJlCompress.html

quazip下载地址 https://sourceforge.net/projects/quazip/

网上一堆推荐这种方法的,可能我与这种方法无缘,崩溃长久伴随着我

===================采用================

3.另外找了一个C++的压缩工具ziplib,下载地址https://bitbucket.org/wbenny/ziplib/downloads/

用VS2017进行编译,测试,也不复杂,于是就集成到qt里面去了

库的编译也简单,打开后生成解决方案就可以了,sample可以测试效果

lib和exe(sample程序)的输出在Bin目录

代码在Source目录

VS2017编译后,形成的是4个lib(最好编译出debug和release两个版本),不是lib+dll的形式

qt中接入lib

CONFIG(debug, debug|release){
LIBS += -L$$PWD/lib/debug -lZipLib -lbzip2 -llzma -lzlib
}else{
LIBS += -L$$PWD/lib/release -lZipLib -lbzip2 -llzma -lzlib
}



debug用debug版本的库,release用release版本的库

不然会报错

error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:  值“0”不匹配值“2”

接入头文件:

不想一个个复制.h文件,所以把整个项目的Source目录里面的ZipLib目录拷贝过去了,

然后qt中封装一下压缩文件和压缩目录

class FileUtils {

public:
static QString getFileNameInPath(QString filePath);
static bool isFileNameExists(QString fileName, QStringList fileNameList);
static QString getCorrectFileNameInFileList(QString originFileName, QStringList fileNameList);
static bool compressFiles(QStringList filePaths, QString zipFilePath);
static bool compressDir(QString dirPath, QString zipFilePath);
};







主要是compressFiles和compressDir

#include "FileUtils.h"
#include
#include
#include
#include
#include

#include "ZipLib/ZipFile.h"
#include "ZipLib/streams/memstream.h"
#include "ZipLib/methods/Bzip2Method.h"


//获取路径中的最后一级的名字,用来设置文件在zip中存放的名字
QString FileUtils::getFileNameInPath(QString filePath){
QString tmp = filePath.replace('\\','/');
QStringList paths = tmp.split('/');
for(int i = paths.size()-1; i>=0; --i){
if(paths[i].trimmed().length()>0){
return paths[i].trimmed();
}
}

return "";
}

//判断文件名重复
bool FileUtils::isFileNameExists(QString fileName, QStringList fileNameList){
if(fileNameList.contains(fileName)){
return true;
}

return false;
}

//如果文件名重复,给个新名字
QString FileUtils::getCorrectFileNameInFileList(QString originFileName, QStringList fileNameList){
if(!isFileNameExists(originFileName, fileNameList)){
return originFileName;
}

int pointIndex = originFileName.lastIndexOf('.');
QString filePrefix = originFileName;
QString filePosfix = "";
if(pointIndex>0){
filePrefix = originFileName.mid(0,pointIndex);
filePosfix = originFileName.mid(pointIndex, originFileName.length() - pointIndex);//pointIndex包含了.
}

QString newName;
int index = 1;
do{
newName = QString("%1(%2)%3").arg(filePrefix).arg(index).arg(filePosfix);
++index;
}while(isFileNameExists(newName, fileNameList));

return newName;
}

//文件大小为0的时候压缩可能有bug,也不想改,直接过滤算了,过滤之后再传进来
bool FileUtils::compressFiles(QStringList filePaths, QString zipFilePath){
if(QFile::exists(zipFilePath)){
if(!QFile::remove(zipFilePath)){
CLog::error(QString("compress fils error for exist zip file path %1, and remove failed").arg(zipFilePath), LOG_PARAM);
return false;
}
}

QStringList fileNameList;
for(auto file : filePaths){
if(QFile::exists(file)){
QString fileName = getFileNameInPath(file);
QString fileNameInArchive = getCorrectFileNameInFileList(fileName, fileNameList);
fileNameList.push_back(fileName);

ZipFile::AddFile(zipFilePath.toStdString(), file.toStdString(), fileNameInArchive.toLocal8Bit().data(), LzmaMethod::Create());
}else{
CLog::error(QString("compress files check %1 not exists").arg(file), LOG_PARAM);
}
}

return true;
}

bool FileUtils::compressDir(QString dirPath, QString zipFilePath){
//判断路径是否存在
QDir dir(dirPath);
if(!dir.exists())
{
return false;
}

if(QFile::exists(zipFilePath)){
if(!QFile::remove(zipFilePath)){
CLog::error(QString("compress dir error for exist zip file path %1, and remove failed").arg(zipFilePath), LOG_PARAM);
return false;
}
}

//获取所选文件类型过滤器
QStringList filters;
//filters<
//定义迭代器并设置过滤器
QDirIterator dir_iterator(dirPath,
filters,
QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
QStringList string_list;

dirPath = dirPath.replace('\\','/');
int subIndex = dirPath.lastIndexOf('/');

while(dir_iterator.hasNext())
{
dir_iterator.next();
if(file_info.size()<1){//文件大小为0的时候压缩可能有bug,也不想改,直接过滤算了
continue;
}
QFileInfo file_info = dir_iterator.fileInfo();
QString absolute_file_path = file_info.absoluteFilePath();
QString fileNameInArchive = absolute_file_path.mid(subIndex);
CLog::log(QString("zip dir for %1").arg(fileNameInArchive), LOG_PARAM);
ZipFile::AddFile(zipFilePath.toStdString(), absolute_file_path.toLocal8Bit().data(), fileNameInArchive.toLocal8Bit().data(), LzmaMethod::Create());
}

return true;
}




























































































































cpp文件一定要采用utf8编码,不然可能回遇到中文就crash

还有要过滤空文件,文件大小为0,的时候可能会卡死

今天的文章 qt集成ziplib压缩文件和目录「建议收藏」分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-09-26 08:17
下一篇 2025-05-31 09:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/139544.html