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

Linux c 在内存中创建zip,最后写入测试

一、libzipzlib 的关

  1. zlib 是一个底层的数据压缩库,它实现了 DEFLATE 压缩算法。它本身不处理 ZIP 文件格式。
  2. libzip 是一个用于创建和操作 ZIP 归档文件的库。ZIP 文件格式内部使用 DEFLATE 算法进行压缩。
  3. libzip 依赖于 zlib 来执行实际的压缩工作。当你用 libzip 添加一个文件时,它会自动调用 zlib 来压缩数据,然后将压缩后的数据写入 ZIP 归档的正确位置。

二、使用libzip 在压缩内存中的数据,同时zip 压缩文件也保存在内存中

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <sstream>#include <zip.h>
static int use_data(void *pbtZipData, size_t nZipData, const char *pstrFileName)
{/* example implementation that writes pbtZipData to file */FILE *fp;if (pbtZipData == NULL) {if (remove(pstrFileName) < 0 && errno != ENOENT) {fprintf(stderr, "can't remove %s: %s\n", pstrFileName, strerror(errno));return -1;}return 0;}if ((fp = fopen(pstrFileName, "wb")) == NULL) {fprintf(stderr, "can't open %s: %s\n", pstrFileName, strerror(errno));return -1;}if (fwrite(pbtZipData, 1, nZipData, fp) < nZipData) {fprintf(stderr, "can't write %s: %s\n", pstrFileName, strerror(errno));fclose(fp);return -1;}if (fclose(fp) < 0) {fprintf(stderr, "can't write %s: %s\n", pstrFileName, strerror(errno));return -1;}return 0;
}bool AddFilesToZip(zip_t* pZipHandle, const char* pstrFileName, const char* pstrData)
{if(pZipHandle && pstrData && pstrFileName){zip_source_t* pstZipSource = zip_source_buffer(pZipHandle, pstrData, strlen(pstrData), 0);if (zip_file_add(pZipHandle, pstrFileName, pstZipSource, ZIP_FL_ENC_UTF_8) >= 0) {return true;}else{std::cerr << "nZipError adding source: " << zip_strerror(pZipHandle) << std::endl;}}return false;
}int main()
{zip_error_t nZipError;zip_error_init(&nZipError);zip_source_t* pstZipSource = zip_source_buffer_create(NULL, 0, 1, &nZipError);if (pstZipSource == NULL) {std::cerr << "can't create source: " << zip_error_strerror(&nZipError) << std::endl;zip_error_fini(&nZipError);return 1;}zip_t* pZipHandle = zip_open_from_source(pstZipSource, ZIP_TRUNCATE, &nZipError);if ((pZipHandle ) == NULL) {std::cerr << "can't open zip from source: " << zip_error_strerror(&nZipError) << std::endl;zip_source_free(pstZipSource);zip_error_fini(&nZipError);return 1;}zip_error_fini(&nZipError);zip_source_keep(pstZipSource);if (!AddFilesToZip(pZipHandle, "123.log"/*测试, 压缩包内部文件*/, "tt"/*测试, 文件内容*/)){return 1;}if (zip_close(pZipHandle) < 0) {std::cerr << "can't close zip pstrFileName" << zip_strerror(pZipHandle) << std::endl;return 1;}//测试, 主要拿到zip 二进制数据,保存文件。参考 examples/in-memory.cunsigned char* pbtZipData = NULL;int nZipData = 0;if (!zip_source_is_deleted(pstZipSource)) {zip_stat_t zst;if (zip_source_stat(pstZipSource, &zst) < 0) {fprintf(stderr, "can't stat source: %s\n", zip_error_strerror(zip_source_error(pstZipSource)));return 1;}nZipData = zst.size;if (zip_source_open(pstZipSource) < 0) {fprintf(stderr, "can't open source: %s\n", zip_error_strerror(zip_source_error(pstZipSource)));return 1;}if ((pbtZipData = (unsigned char*)malloc(nZipData)) == NULL) {fprintf(stderr, "malloc failed: %s\n", strerror(errno));zip_source_close(pstZipSource);return 1;}if ((zip_uint64_t)zip_source_read(pstZipSource, pbtZipData, nZipData) < nZipData) {fprintf(stderr, "can't read pbtZipData from source: %s\n", zip_error_strerror(zip_source_error(pstZipSource)));zip_source_close(pstZipSource);free(pbtZipData);return 1;}zip_source_close(pstZipSource);}/* we're done with pstZipSource */zip_source_free(pstZipSource);/* use new pbtZipData */use_data(pbtZipData, nZipData, "123.zip"/*测试, 压缩包文件名*/);free(pbtZipData);
}

http://www.dtcms.com/a/470044.html

相关文章:

  • 做品牌推广用什么网站眉山网站开发
  • 静态网站源码下载东营免费网站制作
  • 智能体架构设计
  • 2025年三个月自学手册 网络安全(黑客技术),新手小白看这一篇就够了!
  • 无锡做网站要多少钱织梦网站栏目不能更新
  • 网站设计制作公司需要什么资质西部数码网站管理助手 破解版
  • 物联网卡的TAC
  • 学习物联网可以做什么工作?
  • [嵌入式系统-100]:IoT(物联网)与AIoT(人工智能物联网)
  • 网站目录链接怎么做巩义服务专业网站建设
  • 查看apk应用包名
  • 代做淘宝联盟网站东莞网站建设排名公司
  • React 在使用antd的RangePicker时,解决季度选择不是按照当前季度的第一天显示问题
  • 如何理解Vue是渐进式框架
  • 【Vue】——Pinia
  • 网站开发合同注意滨州做网站建设
  • Linux系统编程01:进程概念(万字图文解析)
  • 前端通用AI rules定义,适用于Cursor ,Trae,Qorder等AI开发工具
  • Go 协程在实际项目中的应用详解
  • 最简单的做网站南沙滩网站建设
  • Hive 知识点梳理
  • MySQL常见报错分析及解决方案总结(15)---Can’t connect to MySQL server on ‘localhost‘ (10061)
  • 网站上做的vi设计是怎么做的互联网设计公司排名
  • jetson orin nane 编译 paddle
  • 兰州网站卡法百度网页收录
  • [1-02-05].第04章:Win工具
  • 软件需求规格说明书(SRS)标准模板与编写指南——含功能需求、非功能需求、接口设计与验收标准
  • VS 2022 中创建一个最小的 Django 项目
  • 建设网站的功能定位是什么原因网站建设模版
  • 网站建设教程书籍免费下载网站是公司域名是个人可以吗