使用7zr压缩文件夹
1.使用7zr压缩文件夹
2. 获取压缩文件的哈希值
#include <QProcess>
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QRegularExpression>
int main(int argc, char* argv[]) {
QProcess process;
// 启动程序(带参数示例)
QString z7rpath = "F:/7zr.exe";
QString datadir = "F:/dir/path";
QString zipPath = "zipname1.7z";
process.start(z7rpath, {"a", zipPath, datadir});
// 等待程序启动(可选)
if (!process.waitForStarted(1000)) {
qDebug() << "Failed to start process";
return 1;
}
// 等待程序结束(最多等待30秒)
if (!process.waitForFinished(300000)) {
qDebug() << "Process timed out";
process.kill(); // 强制终止
}
// 获取输出
QByteArray output = process.readAllStandardOutput();
QByteArray error = process.readAllStandardError();
qDebug() << "Output:" << output;
qDebug() << "Errors:" << error;
qDebug() << "Exit code:" << process.exitCode();
process.start(z7rpath, {"h", zipPath});
// 等待程序启动(可选)
if (!process.waitForStarted(1000)) {
qDebug() << "Failed to start process";
return 1;
}
// 等待程序结束(最多等待30秒)
if (!process.waitForFinished()) {
qDebug() << "Process timed out";
process.kill(); // 强制终止
}
output = process.readAllStandardOutput();
error = process.readAllStandardError();
qDebug() << "Output:" << output;
qDebug() << "Errors:" << error;
qDebug() << "Exit code:" << process.exitCode();
// 提取哈希值(根据7zr实际输出格式调整正则表达式)
QRegularExpression re(R"(CRC32\s+for\s+data:\s*([A-Fa-f0-9]{8}))");
QRegularExpressionMatch match = re.match(output);
QString hashValue;
if (match.hasMatch()) {
hashValue = match.captured(1).toUpper();
} else {
// 作为保底方案:使用整个输出
hashValue = output.simplified().replace(" ", "");
qDebug() << "警告:未找到标准哈希格式,使用完整输出";
}
// 将哈希值写入文件
const QString outputFilePath = "hash_result.txt"; // 输出文件路径
QFile file(outputFilePath);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream stream(&file);
stream << "filename: " << zipPath << "\n";
stream << "hashcode: " << hashValue << "\n";
stream << "algorithm: CRC32";
file.close();
qDebug() << "hashcode had save:" << outputFilePath;
} else {
qDebug() << "error: can not write hash code" << file.errorString();
}
return 0;
}
7zr.exe 介绍
7zr.exe 是 7-Zip 的精简版命令行工具,专注于处理 .7z 格式的压缩文件。它独立运行(无需额外 DLL),适合嵌入脚本或资源受限环境。以下是详细使用指南:
一、安装与获取
- Windows
从 https://www.7-zip.org/ 下载安装包,安装后 7zr.exe 位于 C:\Program Files\7-Zip\。
或直接复制独立版 7zr.exe 到项目目录(需匹配 CPU 架构)。
2. Linux
(Debian/Ubuntu)
sudo apt install p7zip
安装后通过终端调用 7zr。
二、核心命令语法
7zr <命令> [参数] <压缩包名> [文件/目录列表]
常用命令:
a:添加文件到压缩包
x:解压并保留完整目录结构
e:解压到当前目录(不保留结构)
l:列出压缩包内容
t:测试压缩包完整性
d:删除压缩包内文件
常用参数:
-mx=[0-9]:压缩级别(0=不压缩,9=最高压缩)
-m0={算法}:指定压缩算法(如 LZMA2、LZ4)
-p{密码}:设置密码
-o{路径}:指定输出目录
-v{大小}:分卷压缩(如 -v10m 每卷 10MB)
-y:跳过确认提示
三、常用操作示例
1. 压缩文件/目录
基本压缩(默认 LZMA2 算法)
7zr a archive.7z D:\data* -mx=9
使用快速算法(LZ4),4线程
7zr a fast.7z D:\data* -m0=LZ4 -mmt=4 -mx=3
加密压缩(含文件名加密)
7zr a secret.7z D:\data* -p123456 -mhe=on
2.解压文件
解压到指定目录(保留目录结构)
7zr x archive.7z -oC:\extracted\ -y
解压加密压缩包
7zr x secret.7z -p123456
3.查看与管理压缩包
列出内容
7zr l archive.7z
删除压缩包内文件
7zr d archive.7z old_file.txt
4.高级操作
分卷压缩(生成 archive.7z.001, archive.7z.002…)
7zr a archive.7z D:\large_data* -v100m
从标准输入压缩(结合 tar)
tar cf - data/ | 7zr a -si data.tar.7z
四、注意事项
- 路径处理
路径含空格或特殊字符时用双引号包裹:
7zr a "C:\My Archive.7z" "D:\My Data\*"
- 递归目录
避免使用 -r 参数(可能引发意外行为),直接用通配符 * 包含子目录。
错误代码
0:成功
1:警告(如部分文件未压缩)
2:致命错误
7:参数错误。
跨平台限制
7z 格式不保留 Linux 文件权限/所有者,备份系统文件建议先打包为 tar 再压缩。
五、总结
轻量高效:7zr.exe 是处理 .7z 格式的理想工具,尤其适合自动化脚本或嵌入式环境。
灵活控制:通过 -m0 和 -mx 平衡速度与压缩率,结合多线程(-mmt)提升效率。
安全加密:-mhe=on 加密文件名,增强隐私保护。
完整参数详见官方文档:https://www.7-zip.org。