关于使用miniz库压缩文件失败

我在使用miniz库,想要将几个文件压缩到一个压缩包内,但是一直提示文件压缩失败,不知道是不是我的参数设置不对,

QString executablePath = QCoreApplication::applicationDirPath();
    QVector<QString> fileVector{"DXFDetail.act","DXFDetail.counters","DXFDetail.fnc","DXFDetail.timers","DXFDetail.variables"};
 
    QString zipFilePath =QString("HCBackupRobot_")+QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")+QString(".zip"); // 设置 ZIP 文件的路径
 
    mz_zip_archive zip_archive;
    memset(&zip_archive, 0, sizeof(zip_archive));
    mz_bool result = mz_zip_writer_init_file(&zip_archive,zipFilePath.toStdString().c_str(),0);
    if(!result)
    {
        qDebug() << "无法创建zip文件:" << zipFilePath;
        QMessageBox::information(NULL,"提醒","无法创建ZIP文件!");
        return;
    }
 
    for(auto fileName : fileVector)
    {
        QString fileTempName = executablePath + "/" + fileName;
        if (!QFile::exists(fileTempName)) {
            qDebug() << "文件不存在:" << fileTempName;
            continue; // 跳过不存在的文件
        }
        if(mz_zip_writer_add_file(&zip_archive,fileName.toStdString().c_str(),fileTempName.toStdString().c_str(),nullptr,0,MZ_BEST_COMPRESSION) != MZ_TRUE)
        {
            qDebug() << "无法添加文件到ZIP压缩包:" << fileTempName;
            mz_zip_writer_end(&zip_archive);
            QMessageBox::information(NULL,"提醒","文件压缩失败!");
            return;
        }
    }
 
    mz_zip_writer_finalize_archive(&zip_archive);
    mz_zip_writer_end(&zip_archive);
    qDebug() << "文件成功压缩到:" << zipFilePath;
    QMessageBox::information(NULL, "提醒", "文件压缩成功!");
 

后续

找到问题所在了,研究了miniz的源码和使用案例,以下是新的代码

ZIPHandle::ZIPHandle()
{
    QVector<QString> fileVector{"DXFDetail.act","DXFDetail.counters","DXFDetail.fnc","DXFDetail.timers","DXFDetail.variables"};

    QString zipFilePath =QString("HCBackupRobot_")+QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")+QString(".zip"); // 设置 ZIP 文件的路径

    mz_zip_archive zip_archive;
    memset(&zip_archive, 0, sizeof(zip_archive));
    mz_bool result = mz_zip_writer_init_file(&zip_archive,zipFilePath.toStdString().c_str(),0);
    if(!result)
    {
        qDebug() << "无法创建zip文件:" << zipFilePath;
        QMessageBox::information(NULL,"提醒","无法创建ZIP文件!");
        return;
    }

    for(auto fileName : fileVector)
    {
        if (!QFile::exists(fileName)) {
            qDebug() << "文件不存在:" << fileName;
            continue; // 跳过不存在的文件
        }

        //读取文件内容
        std::ifstream file(fileName.toStdString(), std::ios::binary);
        if (!file) {
            qDebug() << "Failed to open file: " << fileName.toStdString();
            return;
            }
        std::vector<unsigned char> file_data((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

        //添加文件到压缩包
        if(mz_zip_writer_add_mem(&zip_archive,fileName.toStdString().c_str(),&file_data[0], file_data.size(),MZ_DEFAULT_COMPRESSION)!= MZ_TRUE)
        {
            qDebug() << "无法添加文件到ZIP压缩包:" << fileName;
            mz_zip_writer_end(&zip_archive);
            QMessageBox::information(NULL,"提醒","文件压缩失败!");
            return;
        }
    }

    mz_zip_writer_finalize_archive(&zip_archive);
    mz_zip_writer_end(&zip_archive);
    qDebug() << "文件成功压缩到:" << zipFilePath;
    QMessageBox::information(NULL, "提醒", "文件压缩成功!");
}

miniz的源码案例中使用的是mz_zip_writer_add_mem函数,并非mz_zip_writer_add_file。

同时单独压缩进去的话是没有数据的,还要利用文件的读写功能将内容写入压缩包中的内容。

std::ifstream file(fileName.toStdString(), std::ios::binary);
        if (!file) {
            qDebug() << "Failed to open file: " << fileName.toStdString();
            return;
            }
        std::vector<unsigned char> file_data((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

这样就能成功打包文件了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值