zlib使用:minizlib库编译配置及文件夹压缩

minizlib库编译配置及文件夹压缩/解压缩
摘要由CSDN通过智能技术生成

下载zlib库,zlib-1.2.13\contrib\minizip下的minizlib支持文件夹的压缩解压缩。

使用CMake生成zlib库解决方案,编译时将minizlib中的几个文件:zip.h,.c;unzip.h,.c;ioapi.h,.c;iowin32.h放到静态库工程中(我只需要静态库),统一编成静态库。

注意:因为是需要外部调用,需要配置解决方案的一些宏定义,否则编译过了外面也没法用。就是把ZEXPORT给设置成导出就好。而且有两个宏(ZEXPORT和ZEXTERN)可以控制,可能冲突,注意只能放开ZEXPORT,我在编译过程中还把这个宏给删掉了一些,不多,5.6个,否则编译不过。

下面是从其他地方拷贝的代码,并解决了不支持中文路径和名称的问题。不过查找所有文件*.*这块还是不太好,只能指定类型。
//将文件添加到zip文件中,注意如果源文件srcFile为空则添加空目录    
//fileNameInZip: 在zip文件中的文件名,包含相对路径    
void AddFileToZip(zipFile zf, CString fileNameInZip, CString srcFile)
{
    FILE* srcfp = NULL;

    //初始化写入zip的文件信息
    //zip_fileinfo zi;
    zip_fileinfo   zi = { 0 };

    zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
        zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
    zi.dosDate = 0;
    zi.internal_fa = 0;
    zi.external_fa = 0;

    //如果srcFile为空,加入空目录    
    string new_file_name = "";
    new_file_name += fileNameInZip;
    if (srcFile == "")
    {
        new_file_name += "/";
    }

    //在zip文件中创建新文件    
    zipOpenNewFileInZip(zf, new_file_name.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);


    if (srcFile != "")
    {
        //打开源文件    
        fopen_s(&srcfp, srcFile, "rb");
        if (srcfp == NULL)
        {
            printf("无法添加文件: %s !\n", srcFile);
            zipCloseFileInZip(zf); //关闭zip文件  
            return;
        }

        //读入源文件并写入zip文件    
        char buf[100 * 1024]; //buffer    
        int numBytes = 0;
        while (!feof(srcfp))
        {
            numBytes = fread(buf, 1, sizeof(buf), srcfp);
            zipWriteInFileInZip(zf, buf, numBytes);
            if (ferror(srcfp))
                break;
        }

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Qt中使用zlib进行文件夹压缩和解压缩,可以按照以下步骤进行: 1. 首先,需要将zlib添加到Qt项目中。可以将zlib源码下载到本地,然后在.pro文件中添加如下内容: ``` INCLUDEPATH += /path/to/zlib LIBS += -L/path/to/zlib -lz ``` 其中,/path/to/zlibzlib源码所在路径。 2. 接下来,需要编写压缩和解压缩函数。可以使用zlib提供的函数gzopen、gzwrite、gzclose实现压缩使用gzopen、gzread、gzclose实现解压缩。具体代码如下: ``` #include <zlib.h> #include <QDir> bool compressFolder(const QString &folderPath, const QString &outputFilePath) { gzFile outputFile = gzopen(outputFilePath.toUtf8().constData(), "wb"); if (!outputFile) { return false; } QDir folder(folderPath); QStringList files = folder.entryList(QDir::Files | QDir::NoDotAndDotDot); foreach (const QString &file, files) { QString filePath = folderPath + QDir::separator() + file; QFile inputFile(filePath); if (!inputFile.open(QIODevice::ReadOnly)) { gzclose(outputFile); return false; } while (!inputFile.atEnd()) { QByteArray buffer = inputFile.read(1024); int ret = gzwrite(outputFile, buffer.constData(), buffer.size()); if (ret == 0) { gzclose(outputFile); return false; } } inputFile.close(); } gzclose(outputFile); return true; } bool decompressFolder(const QString &inputFilePath, const QString &outputFolderPath) { gzFile inputFile = gzopen(inputFilePath.toUtf8().constData(), "rb"); if (!inputFile) { return false; } QDir outputFolder(outputFolderPath); if (!outputFolder.exists()) { outputFolder.mkpath("."); } char buffer[1024]; int ret; while ((ret = gzread(inputFile, buffer, sizeof(buffer))) > 0) { QString outputPath = outputFolderPath + QDir::separator() + "temp.dat"; QFile outputFile(outputPath); if (!outputFile.open(QIODevice::Append)) { gzclose(inputFile); return false; } outputFile.write(buffer, ret); outputFile.close(); } gzclose(inputFile); return true; } ``` 3. 最后,在需要压缩或解压缩文件夹的地方调用对应的函数即可。 ``` QString folderPath = "path/to/folder"; QString outputFilePath = "path/to/output/file.gz"; compressFolder(folderPath, outputFilePath); QString inputFilePath = "path/to/input/file.gz"; QString outputFolderPath = "path/to/output/folder"; decompressFolder(inputFilePath, outputFolderPath); ``` 注意,由于zlib只能压缩单个文件,因此在压缩文件夹时需要逐一压缩文件。同样,在解压缩时也需要将读取到的数据写入临时文件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值