服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Qt实现解压带有密码的加密文件

Qt实现解压带有密码的加密文件

2022-09-16 14:10中国好公民st C/C++

Quazip是Qt平台下面的一个压缩解压缩库。本文将利用Quazip实现解压带有密码的加密文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

上一章节中介绍了如何使用Qt编译quazip库以及对文件加解密的简单应用,那么,今天我们继续深挖关于解密操作的功能吧!

简单的解密一个压缩包,可以使用#include "JlCompress.h"中的函数进行静态操作。如果你只是需要简单的应用那么,这个文件中的功能就基本可以满足了。

在我们开发过程中,为了资料的保密性期间,一般情况下都会对压缩包进行加密,那么我们还要使用静态函数的方式进行解密那就不支持了。那么,我们该如何解密带有密码的加密文件呢?

这也是当前文章中的重点啦!

根据官网上给出的结果,一般我们会采取QuaZipFile类来进行非静态的解密方式,该方式也支持了带有密码的压缩包文件。

接下来我来具体讲述该如何实现带有密码的压缩包解密方法吧!

开发环境:VS2017 + Qt5.14.2 x64 win10系统

1.指定zip压缩包状态

在我们操作压缩包的时候,首先要做的就是指明当前是需要压缩还是解压缩文件。

当前,我们实现的功能是解压缩文件,代码实现

?
1
2
QuaZip zip(qsZipFiles);
zip.open(QuaZip::mdUnzip); //解压模式打开

打开Zip文件的方式有以下几种

枚举 说明
QuaZip::mdNotOpen ZIP文件没有打开。这是初始模式
QuaZip::mdUnzip ZIP文件打开以读取里面的文件
QuaZip::mdCreate ZIP文件是通过open()调用创建的
QuaZip::mdAppend 以追加方式打开ZIP文件
QuaZip::mdAdd ZIP文件被打开,用于在存档中添加文件

2.创建解压文件

当我们成功打开压缩文件后的第一步需要创建解压文件,否则解压的文件无法存储。

?
1
2
3
4
5
6
7
8
9
10
11
QString dstPath = qsUnzipFiles;
if (!dstPath.endsWith("/") && !dstPath.endsWith("\\"))
{
    dstPath += "/";
}
 
QDir dir(qsUnzipFiles);
if (!dir.exists())
{
    dir.mkpath(qsUnzipFiles);
}

3.获取实际的压缩数量

?
1
int nCount = zip.getEntriesCount(); //压缩实体数量

4.遍历方式创建解压缩文件

这也是解压缩文件的重点了。

QuaZip::goToFirstFile:将当前文件设置为存档中的第一个文件

QuaZip::goToNextFile:将当前文件设置为存档中的下一个文件

以for循环遍历的方式进行查询,在这里与之前的for循环不同的是以上两个函数的返回值都是bool值,这里我们也需要遍历bool值

?
1
2
3
4
for (bool suc = zip.goToFirstFile(); suc; suc = zip.goToNextFile())
{
    //实际的文件处理
}

这个文件查找方式是如何操作的呢?

在实际运行过程中,goToFirstFile函数会从当前文件夹中的第一个文件夹进行遍历,一直遍历到该文件夹下面没有子文件为止。然后才会访问第二个文件夹。

在for循环中的实际处理是如何呢?

4.1设置解压文件的参数

1:设置压缩包的名称

?
1
2
3
QuaZipFile zipFile;
QString qsTempZipName = zip.getZipName();
zipFile.setZipName(qsTempZipName);

2:设置当前需要解压的文件

?
1
2
QString filename = zip.getCurrentFileName();
zipFile.setFileName(filename);

代码解析:获取当前正在访问的文件夹,并设置需要读取的文件夹名称

4.2以读的方式打开加密文件

?
1
2
3
bool bOpen = zipFile.open(QIODevice::ReadOnly, chPassword);
if(bOpen == false)
    return false;

代码解析:只有在返回值bOpen是true的情况下才代表了读取成功。

如果返回值是false,在路径没有问题的情况下,基本上是密码错误。

注意!!!

在这里需要强烈注意的一点是:输入的密码一定是const char*类型,否则返回值一直是false。这个坑真的是让我特别无语!

4.3获取当前文件的所有内容

?
1
2
QByteArray data = zipFile.readAll();
zipFile.close();

使用readAll的方式读取文件,这个方法就不再过多说明了,很简单,一定要记得,读取文件之后一定要关闭文件!

4.4创建解压缩后的同名文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (filename.endsWith("/"))
{
    dir.mkpath(filename);
}
else
{
    dstFile.setFileName(dstPath + filename);
    if (!dstFile.open(QIODevice::WriteOnly))
    {
        return false;
    }
    dstFile.write(data);
    dstFile.close();
 
}

5.关闭zip压缩包

?
1
zip.close();

这个操作是一定要有的!

到这里,带有密码的压缩包就可以解压出来了!

到此这篇关于Qt实现解压带有密码的加密文件的文章就介绍到这了,更多相关Qt解压加密文件内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7062862777224232973

延伸 · 阅读

精彩推荐
  • C/C++C++实现LeetCode(134.加油站问题)

    C++实现LeetCode(134.加油站问题)

    这篇文章主要介绍了C++实现LeetCode(134.加油站问题),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang10752021-12-06
  • C/C++C++ 名称空间详情

    C++ 名称空间详情

    当一个项目变得大型之后,我们会引入很多的库,这么一来两个库很可能会定义List、Tree、Node同名的类,编译器要是不考虑这情况的话,程序员调用时就会...

    用户9824330962144512022-01-11
  • C/C++C语言实现最小生成树构造算法

    C语言实现最小生成树构造算法

    这篇文章主要为大家详细介绍了C语言实现最小生成树构造算法,利用Prim算法或kruskal算法求解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    n.xuanrui7672021-07-18
  • C/C++c语言获取用户输入字符串是scanf和gets的区别详解

    c语言获取用户输入字符串是scanf和gets的区别详解

    今天小编就为大家分享一篇c语言获取用户输入字符串是scanf和gets的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cowoc19613313264452021-06-28
  • C/C++用c++实现将文本每个单词首字母转换为大写

    用c++实现将文本每个单词首字母转换为大写

    本篇文章是对用c++实现将文本每个单词首字母转换为大写的方法进行了详细的分析介绍,需要的朋友参考下...

    C++教程网4142020-12-14
  • C/C++关于STL中list容器的一些总结

    关于STL中list容器的一些总结

    list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效...

    C语言教程网11972021-01-01
  • C/C++C++ 单例模式的详解及实例

    C++ 单例模式的详解及实例

    这篇文章主要介绍了C++ 单例模式的详解及实例的相关资料,这里对单例中的懒汉模式和饿汉模式进行实现和比较,需要的朋友可以参考下...

    sweet_wen6712021-05-25
  • C/C++C++ decltype类型说明符

    C++ decltype类型说明符

    在C++中,decltype作为操作符,用于查询表达式的数据类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模...

    C++教程网12462021-03-27