使用7zr压缩文件夹

发布于:2025-07-05 ⋅ 阅读:(15) ⋅ 点赞:(0)

使用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),适合嵌入脚本或资源受限环境。以下是详细使用指南:

一、安装与获取

  1. 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

四、注意事项

  1. 路径处理

路径含空格或特殊字符时用双引号包裹:

      7zr a "C:\My Archive.7z" "D:\My Data\*"
  1. 递归目录

避免使用 -r 参数(可能引发意外行为),直接用通配符 * 包含子目录。

  1. 错误代码

    0:成功

    1:警告(如部分文件未压缩)

    2:致命错误

    7:参数错误。

  2. 跨平台限制

7z 格式不保留 Linux 文件权限/所有者,备份系统文件建议先打包为 tar 再压缩。

五、总结

轻量高效:7zr.exe 是处理 .7z 格式的理想工具,尤其适合自动化脚本或嵌入式环境。

灵活控制:通过 -m0 和 -mx 平衡速度与压缩率,结合多线程(-mmt)提升效率。

安全加密:-mhe=on 加密文件名,增强隐私保护。

完整参数详见官方文档:https://www.7-zip.org。