Qt下使用7Z源码进行压缩和解压缩

2024-04-30 12:28

本文主要是介绍Qt下使用7Z源码进行压缩和解压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7Z压缩是一款常用的压缩算法和工具,本文主要介绍一款在qt环境下进行编译的压缩方法。

本人测试是可以正常跑通的,具体代码部分请下载:下载链接,提取码:ev9t

7z源码网址:7-Zip

7z简介:

7z 是一种全新的压缩格式,它拥有极高的压缩比。

7z 格式的主要特征:

  • 开放的结构
  • 高压缩比
  • 强大的 AES-256 加密
  • 能够兼容任意压缩、转换、加密算法
  • 最高支持 16000000000 GB 的文件压缩
  • 以 Unicode 为标准的文件名
  • 支持固实压缩
  • 支持文件头压缩

7z 已公开了结构编辑功能,所以它可以支持任何一种新的压缩算法。到目前为止,下列压缩算法已被整合到了 7z 中:

本文分享的代码具备直接调用7z源码进行操作,具有较高的学习价值。

//列出文件
void MainWindow::on_pushButton_2_clicked()
{Q7z::initSevenZ();const QString path = "E:/ProjectTest/QT/LZMA/lz.7z";QFile file(path);file.open(QIODevice::ReadOnly);QVector<Q7z::File> files = Q7z::listArchive(&file);for(int i =0;i<files.count();i++){Q7z::File file = files.at(i);qDebug()<<file.path;}
}

QVector<File> listArchive(QFileDevice *archive)
{Q7Z_ASSERTS(archive, Readable)const qint64 initialPos = archive->pos();try {CCodecs codecs;if (codecs.Load() != S_OK)throw SevenZipException(QCoreApplication::translate("Q7z", "Cannot load codecs."));COpenOptions op;op.codecs = &codecs;CObjectVector<COpenType> types;op.types = &types;  // Empty, because we use a stream.CIntVector excluded;op.excludedFormats = &excluded;const CMyComPtr<IInStream> stream = new QIODeviceInStream(archive);op.stream = stream; // CMyComPtr is needed, otherwise it crashes in OpenStream().CObjectVector<CProperty> properties;op.props = &properties;CArchiveLink archiveLink;if (archiveLink.Open2(op, nullptr) != S_OK) {throw SevenZipException(QCoreApplication::translate("Q7z","Cannot open archive \"%1\".").arg(archive->fileName()));}QVector<File> flat;for (unsigned i = 0; i < archiveLink.Arcs.Size(); ++i) {IInArchive *const arch = archiveLink.Arcs[i].Archive;UInt32 numItems = 0;if (arch->GetNumberOfItems(&numItems) != S_OK) {throw SevenZipException(QCoreApplication::translate("Q7z","Cannot retrieve number of items in archive."));}flat.reserve(flat.size() + numItems);for (uint item = 0; item < numItems; ++item) {UString s;if (archiveLink.Arcs[i].GetItemPath(item, s) != S_OK) {throw SevenZipException(QCoreApplication::translate("Q7z","Cannot retrieve path of archive item \"%1\".").arg(item));}File f;f.archiveIndex.setX(i);f.archiveIndex.setY(item);f.path = UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/'));Archive_IsItem_Folder(arch, item, f.isDirectory);f.permissions = getPermissions(arch, item, nullptr);getDateTimeProperty(arch, item, kpidMTime, &(f.utcTime));f.uncompressedSize = getUInt64Property(arch, item, kpidSize, 0);f.compressedSize = getUInt64Property(arch, item, kpidPackSize, 0);flat.append(f);}}return flat;} catch (const char *err) {archive->seek(initialPos);throw SevenZipException(err);} catch (const SevenZipException &e) {archive->seek(initialPos);throw e; // re-throw unmodified} catch (...) {archive->seek(initialPos);throw SevenZipException(QCoreApplication::translate("Q7z","Unknown exception caught (%1).").arg(QString::fromLatin1(Q_FUNC_INFO)));}return QVector<File>(); // never reached
}

链接: https://pan.baidu.com/s/15VldB4LMVgl3XbOabGZ-og 提取码: ev9t

请按需提取

这篇关于Qt下使用7Z源码进行压缩和解压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948854

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方