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

C 解压文件

libarchive

Windows下编译 libarchive

  1. CMake 直接使用默认值 Configure->Generate (默认支持zip,rar)
    在这里插入图片描述
  2. 根据自己实际需求安装对应的依赖库,eg:BZIP2
  3. CMake 会出现waring,可以直接忽略
  4. 整体编译会运行test,时间很长。可以只选择编译libarchive

libarchive 解压文件

  1. 如果存在中文需使用wchar或者utf-8否则会解压失败
#include "archive.h"
#include "archive_entry.h"
#include "StringUtil.h"
#include "FileUtil.h"bool UnZipPack(const std::wstring& arPath, const std::wstring& outputDir, unzip_progress progress){std::string UnZipTrackID = jeflib::StringUtil::UUIDString();XLOGI("UnZipPack[%s] begin,arPath[%s] outputDir[%s]", UnZipTrackID.c_str(), W2ACSTR(arPath), W2ACSTR(outputDir));struct archive* ar = archive_read_new();archive_read_support_format_all(ar); // 支持所有格式archive_read_support_filter_all(ar); // 支持所有压缩算法int nerr = archive_read_open_filename_w(ar, arPath.c_str(), 10240);if (nerr != ARCHIVE_OK) {XLOGW("UnZipPack[%s] failed,archive_read_open_filename_w err:%d", UnZipTrackID.c_str(), nerr);return false;}struct archive_entry* entry;while (archive_read_next_header(ar, &entry) == ARCHIVE_OK) {const wchar_t* filename = archive_entry_pathname_w(entry);const wchar_t* src = archive_entry_sourcepath_w(entry);if (filename == nullptr){XLOGW("UnZipPack[%s] archive_entry_sourcepath_w null", UnZipTrackID.c_str());continue;}std::wstring woutfile = jeflib::FileUtil::JoinPathW(outputDir, filename);archive_entry_set_pathname_utf8(entry, W2UTF8CSTR(woutfile));nerr = archive_read_extract(ar, entry, ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM); // 保留文件权限和时间戳XLOGI("UnZipPack[%s] extract file[%s],extract err:%d", UnZipTrackID.c_str(), W2ACSTR(woutfile), nerr);}archive_read_close(ar);archive_read_free(ar);XLOGI("UnZipPack[%s] finished", UnZipTrackID.c_str());return true;}

unrar

  1. 目前只支持rar格式
#include <iostream>
#include <windows.h>
#include "dll.hpp"  // unrar库头文件bool ExtractRar(const char* rarPath,const char* outputDir) {RAROpenArchiveDataEx arcData = { 0 };arcData.ArcName = (char *)rarPath;       // RAR文件路径arcData.OpenMode = RAR_OM_EXTRACT; // 解压模式// 打开压缩包HANDLE hArc = RAROpenArchiveEx(&arcData);if (arcData.OpenResult != 0) {std::cerr << "打开失败: " << arcData.OpenResult << std::endl;return false;}// 逐文件解压RARHeaderDataEx headerData = { 0 };int result;while ((result = RARReadHeaderEx(hArc, &headerData)) == 0) {// 解压当前文件到目标目录if (RARProcessFile(hArc, RAR_EXTRACT, (char *)outputDir,nullptr) != 0) {RARCloseArchive(hArc);return false;}}RARCloseArchive(hArc);return (result == ERAR_SUCCESS); // 检查是否解压完成
}
http://www.dtcms.com/a/270271.html

相关文章:

  • Day55 序列预测任务介绍
  • Subject vs Flowable vs Observable 对比
  • 【零基础学AI】第31讲:目标检测 - YOLO算法
  • 每日算法刷题Day44 7.8:leetcode前缀和4道题,用时1h40min
  • JVM 为什么使用元空间(Metaspace)替换了永久代(PermGen)?——深入理解 Java 方法区与类元数据存储的演进
  • 视频能转成gif动图吗?怎么弄?
  • [NOIP][C++]洛谷P1376 [USACO05MAR] Yogurt factory 机器工厂
  • 没合适的组合wheel包,就自行编译flash_attn吧
  • 行业实践案例:金融行业数据治理体系全景解析
  • Java 关键字详解:掌握所有保留关键字的用途与最佳实践
  • Apache Atlas编译打包,可运行包下载地址
  • DMA技术与音频数据的存储和播放
  • C++STL-vector
  • 【c++学习记录】状态模式,实现一个登陆功能
  • 笔试——Day1
  • numpy数据分析知识总结
  • VMware Workstation不可恢复错误:(vmx)点击设置闪退解决
  • [2-02-02].第03节:环境搭建 - Win10搭建ES集群环境
  • 一天一道Sql题(day03)
  • Choreographer
  • 基于大模型的心肌炎全病程风险预测与诊疗方案研究
  • 使用git生成ssh的ed25519密钥
  • 鲁成伟业精彩亮相第六届中国国际无人机及无人系统博览会
  • 一个vue项目的基本构成
  • DCL学习
  • 操作系统:基本概念
  • Java结构型模式---适配器模式
  • 蓝桥杯 第十六届(2025)真题思路复盘解析
  • 【Bluedroid】BLE 地址解析列表的初始化与清除机制(btm_ble_resolving_list_init)
  • 分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)