我在使用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>());
这样就能成功打包文件了。