当前位置: 首页 > news >正文

利用DeepSeek编写的用于写入文本字符串和二进制数据到zip压缩包中的文件的程序

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <stdexcept>
#include <fstream>
#include "zip.h"  // 假设使用minizip库class ZipWriter {
private:// ZIP文件指针包装器,用于自动管理资源struct ZipDeleter {void operator()(zipFile* zf) const {if (zf && *zf) {zipClose(*zf, nullptr);}}};std::unique_ptr<zipFile, ZipDeleter> zipWrapper_;int compressionLevel_;std::string filename_;public:// 构造函数ZipWriter(const std::string& filename, int compressionLevel = 4): filename_(filename), compressionLevel_(compressionLevel) {// 初始化ZIP文件zipFile zf = zipOpen(filename_.c_str(), APPEND_STATUS_CREATE);if (!zf) {throw std::runtime_error("无法创建ZIP文件: " + filename_);}// 用unique_ptr管理资源zipWrapper_ = std::unique_ptr<zipFile, ZipDeleter>(new zipFile(zf));}// 添加二进制文件到ZIPvoid addBinaryFile(const std::string& zipPath, const std::vector<uint8_t>& data) {if (!zipWrapper_ || !*zipWrapper_) {throw std::runtime_error("ZIP文件未初始化");}zip_fileinfo zi = {0};// 打开ZIP中的新文件int err = zipOpenNewFileInZip(*zipWrapper_, zipPath.c_str(),&zi, nullptr, 0, nullptr, 0, nullptr,Z_DEFLATED, compressionLevel_);if (err != ZIP_OK) {throw std::runtime_error("无法在ZIP中创建文件: " + zipPath);}// 写入二进制数据err = zipWriteInFileInZip(*zipWrapper_, data.data(), static_cast<unsigned int>(data.size()));if (err != ZIP_OK) {zipCloseFileInZip(*zipWrapper_);throw std::runtime_error("写入ZIP文件失败: " + zipPath);}// 关闭ZIP中的文件zipCloseFileInZip(*zipWrapper_);}// 添加文本文件到ZIPvoid addTextFile(const std::string& zipPath, const std::string& content) {// 将文本转换为二进制数据std::vector<uint8_t> data(content.begin(), content.end());addBinaryFile(zipPath, data);}// 从文件系统添加文件到ZIP(二进制方式)void addFileFromDisk(const std::string& zipPath, const std::string& diskPath) {// 读取磁盘文件std::ifstream file(diskPath, std::ios::binary | std::ios::ate);if (!file.is_open()) {throw std::runtime_error("无法打开文件: " + diskPath);}std::streamsize size = file.tellg();file.seekg(0, std::ios::beg);std::vector<uint8_t> buffer(size);if (!file.read(reinterpret_cast<char*>(buffer.data()), size)) {throw std::runtime_error("读取文件失败: " + diskPath);}// 添加到ZIPaddBinaryFile(zipPath, buffer);}// 显式关闭ZIP文件(通常不需要手动调用,析构函数会处理)void close() {zipWrapper_.reset();}// 析构函数~ZipWriter() {if (zipWrapper_ && *zipWrapper_) {close();}}// 禁用拷贝构造和赋值ZipWriter(const ZipWriter&) = delete;ZipWriter& operator=(const ZipWriter&) = delete;
};int main() {try {// 创建ZIP写入器ZipWriter writer("example.zip");// 添加文本文件writer.addTextFile("readme.txt", "这是一个示例文本文件");// 添加二进制文件std::vector<uint8_t> binaryData = {0x48, 0x65, 0x6C, 0x6C, 0x6F};writer.addBinaryFile("data.bin", binaryData);// 从磁盘添加文件writer.addFileFromDisk("disk/zipwriter.cpp","zipwriter.cpp");// 自动关闭(析构函数处理)} catch (const std::exception& e) {std::cerr << "错误: " << e.what() << std::endl;return 1;}return 0;
}

把上述代码保存为zipwriter.cpp,然后编译执行,并用unzip工具观察生成的文件

g++ zipwriter.cpp -o zipwt /par/zlib-1.3.1/contrib/minizip/zip.c /par/zlib-1.3.1/contrib/minizip/ioapi.c -L /par/zlib-1.3.1 -I /par/zlib-1.3.1/ -I /par/zlib-1.3.1/contrib/minizip /par/zlib-1.3.1/libz.a -Wno-register -Wno-cast-qual./zipwtunzip -l example.zip
Archive:  example.zipLength      Date    Time    Name
---------  ---------- -----   ----30  1980-01-00 00:00   readme.txt5  1980-01-00 00:00   data.bin4121  1980-01-00 00:00   disk/zipwriter.cpp
---------                     -------4156                     3 files

另外注意,由于g++编译器比gcc更加严格,需要修改上述zip.c中的一行才能通过编译

    //zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len);// 修改后:zi->ci.crc32 = crc32(zi->ci.crc32, (const Bytef*)buf, (uInt)len);
http://www.lryc.cn/news/625505.html

相关文章:

  • 私有化部署全攻略:开源模型本地化改造的性能与安全评测
  • C语言:字符函数与字符串函数(1)
  • OpenGL 法线
  • 【群晖NAS】在openwrt上实现内网穿透,并配置外网IP映射(Debian/Ubuntu)
  • 使用 Resilience4j 实现 Spring Boot 服务限流:轻量级容错的最佳实践
  • 基于单片机身体健康监测/身体参数测量/心率血氧血压
  • Linux 进程间通信(IPC):信号、共享内存
  • 基于Java(SSM框架)+MySQL实现(Web)的超市管理系统
  • 2025.8.19总结
  • Python 函数进阶:深入理解参数、装饰器与函数式编程
  • 服务器Linux防火墙怎样实现访问控制
  • AAA服务器技术
  • 【实时Linux实战系列】基于实时Linux的智能工业机器人开发
  • 通过分布式系统的视角看Kafka
  • Lua学习记录 - 自定义模块管理器
  • 机械设备制造行业物联网智能化升级改造方案
  • 【habitat学习一】Habitat-Lab 配置键文档详解(CONFIG_KEYS.md)
  • 前端多环境变量配置全攻略:开发 / 测试 / 生产自动切换实战
  • APM32芯得 EP.29 | 基于APM32F103的USB键盘与虚拟串口复合设备配置详解
  • 清空 github 仓库的历史提交记录(创建新分支)
  • HUD抬头显示器太阳光模拟器设备用于杂散光测试介绍
  • 第4章 React状态管理基础
  • 【SpringBoot】Dubbo、Zookeeper
  • QT之QWaitCondition降低cpu占用率,从忙等待到高效同步
  • Qt——文件操作
  • Qt原对象系统工作机制
  • 基于 PyTorch 模型训练优化、FastAPI 跨域配置与 Vue 响应式交互的手写数字识别
  • SpreadJS 协同服务器 MongoDB 数据库适配支持
  • JavaSSM框架从入门到精通!第二天(MyBatis(一))!
  • EasyExcel 合并单元格最佳实践:基于注解的自动合并与样式控制