基于QT使用7z压缩与解压总结

news2024/12/23 5:30:48

1.    概述
本文主要讲述使用7z第三方工具对文件或文件夹进行加密压缩和解密解压相关方法。7z的全称7-Zip,是一款开源软件。(资源主页:https://7-zip.org/)
2.    设计原理
本文主要使用7z.exe通过命令行来实现压缩与解压功能,该进程需要依赖7z.dll实现对应功能。开发时需要将7z.exe和7z.dll放到同一个目录下才可正常使用,通常将这两个文件直接放到软件对应执行文件目录下即可。(例如:将7z.exe和7z.dll 文件放到IS05.exe同级目录)
支持格式:
压缩 / 解压缩:7z, XZ, BZIP2, GZIP, TAR, ZIP;
仅解压缩:ARJ, CAB, CHM, CPIO, DEB, DMG, FAT, HFS, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, RAR, RPM, UDF, VHD, WIM, XAR, Z;

使用语法:
7z.exe <命令行> [<选项>...] <基本档案名称> [<参数变量>...]
在方括号内的表达式(“[” 和 “]”之间的字符)是可选的。
在书名号内的表达式(“<” 和 “>”之间的字符)是必须替换的表达式(而且要去掉括号)

常用命令行:
a:添加文件到压缩档案
d:删除归档文件
e:从存档中提取文件(不使用目录名)
rn:重命名归档中的文件
t:测试存档的完整性
u:更新文件到存档
X:解压全路径文件

基本档案名称:
指压缩包的文件名称,例如:archive.zip、archive.rar、archive.7z等

常用执行参数变量:
-m{Parameters}:设置压缩方法
-o{Directory}:设置输出目录
-p{Password}:设置密码
-r[-|0]:递归子目录
-sdel:删除压缩后的文件
-t{Type}:设置归档文件的类型
-w[{path}]:指定工作目录。空路径是指临时目录
-y:对所有查询都假定是
命令使用实例:
1)    a 添加文件到压缩档案
7z.exe a archive1.zip subdir\ :增加subdir文件夹下的所有的文件和子文件夹到archive1.zip中,archived1.zip中的文件名包含subdir\前缀。

2)    d 从压缩档案删除文件。
7z.exe d archive.zip *.bak -r :从archive.zip中删除所有的bak文件。

3)    e 从压缩档案中释放文件到当前目录中。或者到指定的输出文件夹。输出文件夹设置可以通过 -o (设置输出文件夹) 选项来更改。此命令会将所有被释放的文件放置到一个文件夹。如果您想使用完整路径释放文件,您必须使用 x (完整路径释放) 命令。 
7z.exe e archive.zip :从压缩档案 archive.zip 中释放所有文件到当前文件夹。

4)    -o 指定释放文件的输出文件夹。此选项只能和释放命令配合使用。
7z.exe x archive.zip -oc:\Doc :从 archive.zip 压缩档案释放所有文件到 c:\Doc 文件夹。

5)    -y 使 7-Zip 执行命令时的大多数提示失效。您可以使用此选项来阻止在 e (释放) 和 x (完整路径释放) 命令中文件覆盖时的提示。
7z.exe x src.zip -y :从 src.zip 释放所有文件。所有的覆盖提示将被阻止且所有相同文件名的文件将被覆盖。

6)    -p 指定密码。
7z.exe x archive.zip -psecret :将设有密码“secret”的压缩档案 archive.zip 中所有文件释放。
3.    开发实战
注意:开发前,需要将7z.exe和7z.dll放到执行文件目录下,方便程序直接调用。
1)    QT中实现带密码压缩功能
源码:以下实例是使用Qt的QProcess类来执行进程压缩命令,好处是不会弹控制台窗口
        QProcess runLogProcess;
        runLogProcess.start("cmd"); //启动cmd终端进程
        runLogProcess.waitForStarted(-1);
        QString _7zPath = QString("%1/7z.exe").arg(QCoreApplication::applicationDirPath());
        QString Strcmd = QString("%1 a %2 -p%3 %4\r\n").arg("7z.exe").arg(zip).arg("123456").arg(folder);//组包带密码压缩命令,密码为“123456”
        runLogProcess.write(Strcmd.toLocal8Bit().data());//执行带密码压缩命令
        runLogProcess.write("exit\n");//退出终端进程
        runLogProcess.waitForFinished(-1);
    
        QString temp = runLogProcess.readAll();//读取终端进程输出的所以信息
        printf("%s", temp.toLocal8Bit().data());
        runLogProcess.close();
//根据终端进程输出信息判断是否成功
        if (temp.contains("Everything is Ok"))
        {
            QMessageBox messageBox;
            messageBox.setWindowTitle(tr("提示"));
            messageBox.setText(tr("加密压缩成功!"));
            messageBox.setButtonText(1, tr("确定"));
            messageBox.exec();
        }
        else
        {
            QMessageBox messageBox;
            messageBox.setWindowTitle(tr("提示"));
            messageBox.setText(tr("加密压缩失败!"));
            messageBox.setButtonText(1, tr("确定"));
            messageBox.exec();
        }

Demo程序执行效果:

控制台输出:
 
2)QT中实现带密码解压功能
源码:以下实例是使用Qt的QProcess类来执行进程解压命令,好处是不会弹控制台窗口
        QProcess runLogProcess;
        runLogProcess.start("cmd");//启动cmd终端进程
        runLogProcess.waitForStarted(-1);
        QString _7zPath = QString("%1/7z.exe").arg(QCoreApplication::applicationDirPath());
        QString Strcmd = QString("%1 x %2 -p%3 -y -o%4\r\n").arg("7z.exe").arg(zip).arg("123456").arg(folder);//组包带密码解压命令,密码为“123456”
        runLogProcess.write(Strcmd.toLocal8Bit().data());//执行带密码解压命令
        runLogProcess.write("exit\n");//退出终端进程
        runLogProcess.waitForFinished(-1);

 

        QString temp = runLogProcess.readAll();//读取终端进程输出的所以信息
        printf("%s", temp.toLocal8Bit().data());
        runLogProcess.close();
//根据控制台输出信息判断是否成功
        if (temp.contains("Everything is Ok"))
        {
            QMessageBox messageBox;
            messageBox.setWindowTitle(tr("提示"));
            messageBox.setText(tr("解密解压成功!"));
            messageBox.setButtonText(1, tr("确定"));
            messageBox.exec();
        }
        else
        {
            QMessageBox messageBox;
            messageBox.setWindowTitle(tr("提示"));
            messageBox.setText(tr("解密解压失败!"));
            messageBox.setButtonText(1, tr("确定"));
            messageBox.exec();
        }

Demo程序执行效果:


 

 控制台输出:

 
  
 

附件:软件依赖文件7z.dll和7z.exe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库之MySQL字符集与数据库操作

目录 字符集 CHRARCTER SET 与COLLATION的关联 CHRARCTER SET 定义 基础操作 查看当前MySQL Server支持的 CHARACTER SET 查看特定字符集信息&#xff08;主要包含默认的COLLATION 与 MAXLEN&#xff09; COLLATION 定义 COLLATION后缀 基础操作 查看MySQL Server支持的…

C++教程(一)开发环境visual studio的安装——图文详细

一、visual studio下载地址&#xff1a; 1、百度网盘 链接&#xff1a;https://pan.baidu.com/s/1QJosSoAT7EumuvyjtC_1Iw?pwdwuqz 提取码&#xff1a;wuqz 2、官网下载 Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com)https://visualstudio.…

【Linux】vi编辑器的使用,要求能新建、编辑、保存一个文本文件。

&#xff08;1&#xff09;点击”应用程序”→ “附件”→“终端”&#xff0c;打开终端&#xff0c;在终端输入命令&#xff1a; [rootlocalhost root]#vi kk.c按 i 键&#xff0c;进入插入状态。 &#xff08;2&#xff09;输入以下C程序 #include<stdio.h>int main( …

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java用native修饰的方法

今天看JDK ServerSocket源代码的时候&#xff0c;通过层层调用&#xff0c;到了用native修饰的方法&#xff0c;然后再也跟不下去了。 例如sun.nio.ch.Net类中下面的方法&#xff1a; Java方法如果用native修饰&#xff0c;就表示这个方法的实现不是用java实现的&#xff0c…

Element Ui Tree组件实现增、删、改、查、拖拽节点 的树形结构

介绍&#xff1a;首先组件 | Element官网某些功能都具备了&#xff0c;这里我就把这些功能结合在一起更完美的使用&#xff0c;其次编辑节点官网是没有实例&#xff0c;所以这里搞了一套较完整的功能&#xff0c;其次编辑和添加&#xff0c;这里直接使用了弹窗&#xff08;顾及…

单位列表单列出来,假(封装)组件

效果图&#xff1a; 因为每个页面都用到这个单位&#xff0c;所以把单位列表单列出来&#xff0c;假装是个封装的组件&#xff0c;在其他页面直接用。 源码&#xff1a; <template><div style"height: 48rem;overflow-y: scroll"><h4>单位列表<…

阿里云国际站代理商:阿里云是干什么的?阿里云app和建网站有什么关系?

标题&#xff1a;阿里云是干什么的&#xff1f;阿里云app和建网站有什么关系&#xff1f;   一、解析阿里云的业务范围   阿里云&#xff0c;作为阿里巴巴集团的关键业务板块&#xff0c;主要提供云计算、大数据、人工智能及其他信息化服务。通过其全球网络&#xff0c;阿里…

8 spring-boot访问静态资源

8.1 静态资源存放的位置 在资源目录下分别创建public和resources两个文件夹&#xff0c;static是一开始就存在的&#xff0c;静态资源可以存放在这三个文件夹中。当这三个文件夹同时出现相同的静态资源&#xff0c;如每个文件夹都有一个1.js时&#xff0c;则优先访问resources里…

vue 目录

vue学习资源 vue.js中文官网&#xff1a; http://cn.vuejs.org/ vue.js源码&#xff1a; https://github.com/vuejs/vue vue.js官方工具&#xff1a; https://github.com/vuejs vue.js英文官网&#xff1a; https://vuejs.org/ vue全家桶 介绍 介绍 【 Vue全家桶 Vue&#xff…

Vue3使用echarts仪表盘(gauge)

Documentation - Apache ECharts 可自定义设置以下属性 仪表盘数据源&#xff08;gaugeData&#xff09;&#xff0c;类型&#xff1a;Gauge[]&#xff0c;必传&#xff0c;默认 []容器宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a;number | string&#x…

web前端(二)

表格标签&#xff1a; <table> </table>按照这个顺序&#xff1a;一个可选的 <caption> 元素零个或多个的 <colgroup> 元素一个可选的 <thead> 元素下列任意一个&#xff1a;零个或多个 <tbody>零个或多个 <tr>一个可选的 <t…

轻量应用服务器5m支持多少人访问?

​  轻量应用服务器5m支持多少人访问?对于网站而言&#xff0c;服务器的带宽肯定是越大越好&#xff0c;但对于用户的钱包则相反&#xff0c;服务器的价格高低与带宽大小、类型也有很大的关系&#xff0c;我们只有选择到合适的带宽才能将轻量应用服务器显得更有性价比&#…

复习V2+V3之——01 前言回顾

前言 Vue的特点 采用组件化的模式&#xff0c;提高代码复用率&#xff0c;让代码更好维护 声明式编码&#xff0c;开发者无需直接操作DOM&#xff0c;提高开发效率 使用虚拟DOM Diff算法&#xff0c;尽量复用DOM节点 虚拟DOM&#xff08;Virtual DOM&#xff09;&#xff1…

JAVA 牛客网 NC32求平方根

题目如图&#xff1a; 先展示代码&#xff1a; import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** param x int整型* return int整型*/public int sqrt (int x) {if(x<2)…

递归回溯两个例题:1.数组组合 2.在矩阵中搜索单词

题目1&#xff1a;组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 解题思路&#xff1a; 1.定…

Mac苹果电脑也可以玩原神了,运行流程,nice~

最近发现了一个很棒的工具&#xff0c;他可以让你的 Mac 苹果电脑运行原神&#xff0c;而且画质和流畅度都是在线的&#xff0c;今天分享给大家 软件名字叫 playCover &#xff0c;根据作者的介绍这款软件最初就是国外的一位博主想在 Mac 上玩原神特意开发的一款软件&#xff…

代码随想录二刷 day45 | 动态规划 之 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

day45 70. 爬楼梯 &#xff08;进阶&#xff09;1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp数组 322. 零钱兑换1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 279.完全平方数1.…

作为一名研究生/博士生,我应该知道什么

今天分享的是一位深度学习领域的大佬在2020年7月份写的一篇博客&#xff0c;看完或许对有缘的你带来些启发。 英文原址&#xff1a;大佬博客地址 https://theorangeduck.com/page/reproduce-their-results 1&#xff1a;我希望作为一名研究生我知道什么 在我攻读博士学位之初…

vue 多级导航菜单

目录&#xff0c;三个文件 tree-node.vue <template><div class"tree-node-container"><node-content></node-content><divclass"tree-node-children":style"{paddingLeft: indent}"v-if"nextShow">&l…