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



















