目录
  • 1.指定zip压缩包状态
  • 2.创建解压文件
  • 3.获取实际的压缩数量
  • 4.遍历方式创建解压缩文件
    • 4.1设置解压文件的参数
    • 4.2以读的方式打开加密文件
    • 4.3获取当前文件的所有内容
    • 4.4创建解压缩后的同名文件
  • 5.关闭zip压缩包

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

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

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

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

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

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

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

    1.指定zip压缩包状态

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

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

    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.创建解压文件

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

    QString dstPath = qsUnzipFiles;
    if (!dstPath.endsWith("/") && !dstPath.endsWith("\\"))
    {
    	dstPath += "/";
    }
    
    QDir dir(qsUnzipFiles);
    if (!dir.exists())
    {
    	dir.mkpath(qsUnzipFiles);
    }

    3.获取实际的压缩数量

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

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

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

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

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

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

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

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

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

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

    4.1设置解压文件的参数

    1:设置压缩包的名称

    QuaZipFile zipFile;
    QString qsTempZipName = zip.getZipName();
    zipFile.setZipName(qsTempZipName);

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

    QString filename = zip.getCurrentFileName();
    zipFile.setFileName(filename);
    

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

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

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

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

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

    注意!!!

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

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

    QByteArray data = zipFile.readAll();
    zipFile.close();

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

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

    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压缩包

    zip.close();

    这个操作是一定要有的!

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

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。