使用POCO库进行ZIP压缩和解压

news2025/4/13 2:28:12

使用POCO库进行ZIP压缩和解压

POCO C++ Libraries提供了一个ZIP模块,可以方便地进行文件和数据流的压缩与解压操作。下面我将介绍如何使用POCO的ZIP模块进行这些操作。

1. 基本ZIP文件操作

压缩文件/目录到ZIP

#include <Poco/Zip/Compress.h>
#include <Poco/File.h>
#include <Poco/Path.h>
#include <iostream>
#include <fstream>

void compressToZip(const std::string& source, const std::string& zipFile)
{
    try {
        std::ofstream out(zipFile, std::ios::binary);
        Poco::Zip::Compress c(out, true);
        
        Poco::File f(source);
        if (f.isDirectory()) {
            c.addRecursive(f, Poco::Zip::ZipCommon::CL_MAXIMUM, f.path());
        } else {
            c.addFile(f, f.path());
        }
        
        c.close(); // 必须调用close()完成ZIP文件
        out.close();
        
        std::cout << "Successfully created ZIP file: " << zipFile << std::endl;
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
// compressToZip("my_folder", "output.zip");
// compressToZip("file.txt", "file.zip");

解压ZIP文件

#include <Poco/Zip/Decompress.h>
#include <Poco/Path.h>
#include <iostream>
#include <fstream>

void decompressZip(const std::string& zipFile, const std::string& destDir)
{
    try {
        std::ifstream in(zipFile, std::ios::binary);
        Poco::Zip::Decompress d(in, Poco::Path(destDir));
        d.decompressAllFiles();
        in.close();
        
        std::cout << "Successfully extracted ZIP file to: " << destDir << std::endl;
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
// decompressZip("archive.zip", "extracted_files");

2. 流数据压缩和解压

POCO还提供了对数据流进行压缩和解压的功能,使用的是Poco::Zip::ZipStream

压缩数据流

#include <Poco/Zip/ZipStream.h>
#include <Poco/Zip/ZipArchive.h>
#include <Poco/Zip/ZipLocalFileHeader.h>
#include <iostream>
#include <sstream>
#include <fstream>

void compressStreamToZip(const std::string& outputFile)
{
    try {
        std::ofstream out(outputFile, std::ios::binary);
        Poco::Zip::ZipOutputStream zipOut(out);
        
        // 添加第一个文件到ZIP
        zipOut.putNextEntry("file1.txt");
        std::string content1 = "This is the content of file1.txt";
        zipOut << content1;
        
        // 添加第二个文件到ZIP
        zipOut.putNextEntry("subdir/file2.txt");
        std::string content2 = "This is file2.txt in a subdirectory";
        zipOut << content2;
        
        zipOut.close();
        out.close();
        
        std::cout << "Successfully created ZIP from streams: " << outputFile << std::endl;
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
// compressStreamToZip("stream_output.zip");

解压数据流

#include <Poco/Zip/ZipStream.h>
#include <Poco/Zip/ZipArchive.h>
#include <iostream>
#include <fstream>
#include <sstream>

void decompressZipToStreams(const std::string& zipFile)
{
    try {
        std::ifstream in(zipFile, std::ios::binary);
        Poco::Zip::ZipArchive archive(in);
        
        for (auto it = archive.headerBegin(); it != archive.headerEnd(); ++it) {
            const Poco::Zip::ZipLocalFileHeader& header = *it;
            if (header.isFile()) {
                std::cout << "Extracting: " << header.getFileName() << std::endl;
                
                std::istream* pStream = archive.findStream(header.getFileName());
                if (pStream) {
                    std::stringstream content;
                    Poco::StreamCopier::copyStream(*pStream, content);
                    std::cout << "Content:\n" << content.str() << "\n" << std::endl;
                }
            }
        }
        
        in.close();
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
// decompressZipToStreams("stream_output.zip");

3. 内存中的ZIP操作

在内存中创建ZIP

#include <Poco/Zip/ZipStream.h>
#include <Poco/Zip/ZipArchive.h>
#include <iostream>
#include <sstream>

void createZipInMemory()
{
    try {
        std::stringstream outStream(std::ios::in | std::ios::out | std::ios::binary);
        Poco::Zip::ZipOutputStream zipOut(outStream);
        
        // 添加文件到内存中的ZIP
        zipOut.putNextEntry("memory_file.txt");
        std::string content = "This file was created in memory";
        zipOut << content;
        
        zipOut.close();
        
        // 获取ZIP数据
        std::string zipData = outStream.str();
        std::cout << "Created ZIP in memory, size: " << zipData.size() << " bytes" << std::endl;
        
        // 可以将zipData保存到文件或通过网络发送
        // std::ofstream("memory.zip", std::ios::binary) << zipData;
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
// createZipInMemory();

从内存中读取ZIP

#include <Poco/Zip/ZipArchive.h>
#include <iostream>
#include <sstream>
#include <vector>

void readZipFromMemory(const std::vector<char>& zipData)
{
    try {
        std::stringstream inStream(std::ios::in | std::ios::out | std::ios::binary);
        inStream.write(zipData.data(), zipData.size());
        
        Poco::Zip::ZipArchive archive(inStream);
        
        for (auto it = archive.headerBegin(); it != archive.headerEnd(); ++it) {
            const Poco::Zip::ZipLocalFileHeader& header = *it;
            if (header.isFile()) {
                std::cout << "Found file in memory ZIP: " << header.getFileName() << std::endl;
                
                std::istream* pStream = archive.findStream(header.getFileName());
                if (pStream) {
                    std::stringstream content;
                    Poco::StreamCopier::copyStream(*pStream, content);
                    std::cout << "Content:\n" << content.str() << std::endl;
                }
            }
        }
    } catch (Poco::Exception& e) {
        std::cerr << "Error: " << e.displayText() << std::endl;
    }
}

// 使用示例
/*
std::vector<char> zipData = ...; // 从文件或网络获取的ZIP数据
readZipFromMemory(zipData);
*/

注意事项

  1. 确保在项目中正确链接POCO的Foundation和Zip库。
  2. 压缩或解压大文件时,考虑使用缓冲区以提高性能。
  3. 处理ZIP文件时要注意路径安全问题,特别是解压来自不可信源的ZIP文件时。
  4. 所有示例代码都需要包含相应的POCO头文件,并处理可能的异常。

以上示例展示了POCO库中ZIP模块的基本用法,你可以根据实际需求进行调整和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶的未来:多模态感知融合技术最新进展

作为自动驾驶领域的专业人士&#xff0c;我很高兴与大家分享关于多模态感知融合技术的前沿研究和实践经验。在迅速发展的自动驾驶领域&#xff0c;多模态感知融合已成为提升系统性能的关键技术。本文将深入探讨基于摄像头和激光雷达的多模态感知融合技术&#xff0c;重点关注最…

亮相2025全球分布式云大会,火山引擎边缘云落地AI新场景

4 月 9 日&#xff0c;2025 全球分布式云大会暨 AI 基础设施大会在深圳成功举办&#xff0c;火山引擎边缘云产品解决方案高级总监沈建发出席并以《智启边缘&#xff0c;畅想未来&#xff1a;边缘计算新场景落地与 Al 趋势新畅想》为主题&#xff0c;分享了边缘计算在 AI 技术趋…

无损分区管理,硬盘管理的“瑞士军刀”!

打工人们你们好&#xff01;这里是摸鱼 特供版~ 今天给大家带来一款简单易用、功能强大的无损分区软件——分区助手技术员版&#xff0c;让你的硬盘管理变得轻松又高效&#xff01; 推荐指数&#xff1a;★★★★★ 软件简介 分区助手技术员版是一款功能强大的硬盘分区工具&…

VS Code下开发FPGA——FPGA开发体验提升__下

上一篇&#xff1a;IntelliJ IDEA下开发FPGA-CSDN博客 Type&#xff1a;Quartus 一、安装插件 在应用商店先安装Digtal IDE插件 安装后&#xff0c;把其他相关的Verilog插件禁用&#xff0c;避免可能的冲突。重启后&#xff0c;可能会弹出下面提示 这是插件默认要求的工具链&a…

ffmpeg播放音视频流程

文章目录 &#x1f3ac; FFmpeg 解码播放流程概览&#xff08;以音视频文件为例&#xff09;1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包&#xff08;Packet&#xff09;5️⃣ 解码成帧&#xff08;Frame&#xff09;6️⃣ 播放 / …

SpringCloud微服务: 分布式架构实战

# SpringCloud微服务: 分布式架构实战 第一章&#xff1a;理解SpringCloud微服务架构 什么是SpringCloud微服务架构&#xff1f; 在当今互联网应用开发中&#xff0c;微服务架构已经成为业界的主流趋势。SpringCloud是一个基于Spring Boot的快速开发微服务架构的工具&#xff0…

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月11日第49弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…

【models】Transformer 之 各种 Attention 原理和实现

Transformer 之 各种 Attention 原理和实现 本文将介绍Transformer 中常见的Attention的原理和实现&#xff0c;其中包括&#xff1a; Self Attention、Spatial Attention、Temporal Attention、Cross Attention、Grouped Attention、Tensor Product Attention、FlashAttentio…

老硬件也能运行的Win11 IoT LTSC (OEM)物联网版

#记录工作 Windows 11 IoT Enterprise LTSC 2024 属于物联网相关的版本。 Windows 11 IoT Enterprise 是为物联网设备和场景设计的操作系统版本。它通常针对特定的工业控制、智能设备等物联网应用进行了优化和定制&#xff0c;以满足这些领域对稳定性、安全性和长期支持的需求…

Git开发

目录 Linux下Git安装Git基本指令分支管理远程仓库与本地仓库标签管理多人协作同一分支下不同分支下 企业级开发模型 -- git flow 模型 在现实中&#xff0c;当我们完成一个文档的初稿后&#xff0c;后面可能还需要对初稿进行反复修改&#xff0c;从而形成不同版本的文档。显然&…

verilog有符号数的乘法

无符号整数的乘法 1、单周期乘法器&#xff08; 无符号整数 &#xff09; 对于低速要求的乘法器&#xff0c;可以简单的使用 * 实现。 module Mult(input wire [7:0] multiplicand ,input wire [7:0] multipliter ,output wire [7:0] product);as…

DevDocs:抓取并整理技术文档的MCP服务

GitHub&#xff1a;https://github.com/cyberagiinc/DevDocs 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI DevDocs 是一个完全免费的开源工具&#xff0c;由 CyberAGI 团队开发&#xff0c;托管在 GitHub 上。它专为程序员和软件开发…

第十四届蓝桥杯大赛软件赛国赛Python大学B组题解

文章目录 弹珠堆放划分偶串交易账本背包问题翻转最大阶梯最长回文前后缀贸易航线困局 弹珠堆放 递推式 a i a i − 1 i a_ia_{i-1}i ai​ai−1​i&#xff0c; n 20230610 n20230610 n20230610非常小&#xff0c;直接模拟 答案等于 494 494 494 划分 因为总和为 1 e 6 1e6…

折叠屏手机:技术进步了,柔性OLED面板测试技术需求跟上了吗?

全球智能手机市场陷入创新焦虑&#xff0c;折叠屏手机被寄予厚望&#xff0c;2023 年出货量同比增长 62%。但在供应链技术狂欢背后&#xff0c;存在诸多问题。消费端数据显示&#xff0c;用户使用频率低&#xff0c;定价策略反常。产业链重构虽让部分企业获利&#xff0c;却推高…

30天学Java第九天——线程

并行与并发的区别 并行是多核 CPU 上的多任务处理&#xff0c;多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理&#xff0c;多个任务在同一时间段内交替执行&#xff0c;通过时间片轮转实现交替执行&#xff0c;用于解决 IO 密集型任务的瓶颈 线程的创建方式…

自行搭建一个Git仓库托管平台

1.安装Git sudo apt install git 2.Git本地仓库创建&#xff08;自己选择一个文件夹&#xff09; git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件&#xff0c;并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…

【前端分享】JavaScript异步编程详解!

JavaScript 的异步编程是其核心特性之一&#xff0c;主要用于处理非阻塞操作&#xff08;如网络请求、文件读写、定时任务等&#xff09;。由于 JavaScript 是单线程的&#xff0c;异步机制可以避免代码阻塞&#xff0c;提高性能和用户体验。以下是 JavaScript 异步编程的核心概…

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式&#xff0c;主要是用来完成对象的创建&#xff0c;使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合&#xff0c;简化new 对象的创建。 优势 &#xff1a;对象的属性创建完整。 缺点&#xff1a; 创建…

Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量

文章目录 引言作用域:全局变量作用域>局部变量作用域I 基于全局变量实现一个简单的登陆操作设置变量值的交互动作打开链接的交互动作接收并显示变量值注意点see also共享原型引言 全局变量在交互效果作用是页面值传递 作用域:全局变量作用域>局部变量作用域 全局变量…