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

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
05-31
您需要使用Qt中提供的Zip库来进行zip文件的创建和解压缩。以下是一个简单的示例代码,用于创建一个zip文件: ```cpp #include <QDir> #include <QFile> #include <QFileInfo> #include <QZipWriter> void createZip(const QString& zipFilePath, const QString& sourceDirPath) { // Create a QFile object for the zip file QFile zipFile(zipFilePath); if (!zipFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open zip file: " << zipFilePath; return; } // Create a QZipWriter object for writing to the zip file QZipWriter zip(&zipFile); // Iterate through all the files in the source directory QDir sourceDir(sourceDirPath); for (const QFileInfo& fileInfo : sourceDir.entryInfoList(QDir::Files)) { // Get the path of the file relative to the source directory QString filePath = fileInfo.absoluteFilePath(); QString relativeFilePath = sourceDir.relativeFilePath(filePath); // Add the file to the zip archive if (!zip.addFile(filePath, relativeFilePath)) { qDebug() << "Failed to add file to zip archive: " << filePath; } } // Close the zip archive zip.close(); } ``` 调用`createZip`函数并传入要创建的zip文件路径和源目录路径即可创建一个zip文件。 解压缩zip文件也很简单,使用QZipReader类即可。以下是一个简单的示例代码,用于解压缩一个zip文件: ```cpp #include <QDir> #include <QFile> #include <QFileInfo> #include <QZipReader> void extractZip(const QString& zipFilePath, const QString& destinationDirPath) { // Create a QZipReader object for reading the zip file QZipReader zip(zipFilePath); if (!zip.isValid()) { qDebug() << "Invalid zip file: " << zipFilePath; return; } // Iterate through all the files in the zip archive for (const QString& filePath : zip.fileNames()) { // Get the path of the file relative to the zip archive QString relativeFilePath = filePath; // Extract the file to the destination directory QString destinationFilePath = QDir(destinationDirPath).filePath(relativeFilePath); if (!zip.extractFile(filePath, destinationFilePath)) { qDebug() << "Failed to extract file from zip archive: " << filePath; } } // Close the zip archive zip.close(); } ``` 调用`extractZip`函数并传入要解压缩的zip文件路径和目标目录路径即可解压缩zip文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值