C 压缩和解压文件 libarchiveWindows下编译libarchiveCMake 直接使用默认值 Configure-Generate 默认支持rar,不支持zip根据自己实际需求安装对应的依赖库eg:BZIP2CMake 会出现waring可以直接忽略整体编译会运行test时间很长。可以只选择编译libarchive如果提示“libgcc not found”在vs的编译环境下是不需要gcc的。取消gcc 选项 ENABLE_LIBGCC注释 # MESSAGE(FATAL_ERROR “libgcc not found.”)引入zlib支持zip如果需要MT模块同步调整ssl引入zstdforZIPXlibarchive 解压文件# 如果使用MT静态库增加预定义宏 LIBARCHIVE_STATIC ZLIB_WINAPI #需要引入库 archive.lib zlibstaticd.lib libssl64MTd.lib libcrypto64MTd.lib XmlLite.lib libzstd_static.lib如果存在中文需使用wchar或者utf-8否则会解压失败#includearchive.h#includearchive_entry.h#includeStringUtil.h#includeFileUtil.hboolUnZipPack(conststd::wstringarPath,conststd::wstringoutputDir,unzip_progress progress){std::string UnZipTrackIDjeflib::StringUtil::UUIDString();XLOGI(UnZipPack[%s] begin,arPath[%s] outputDir[%s],UnZipTrackID.c_str(),W2ACSTR(arPath),W2ACSTR(outputDir));structarchive*ararchive_read_new();archive_read_support_format_all(ar);// 支持所有格式archive_read_support_filter_all(ar);// 支持所有压缩算法archive_read_set_options(ar,charsetUTF-8);intnerrarchive_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);archive_read_free(ar);returnfalse;}structarchive_entry*entry;while(archive_read_next_header(ar,entry)ARCHIVE_OK){/*#define AES_SET_MBS 1 #define AES_SET_UTF8 2 #define AES_SET_WCS 4*/// 优先级 mbs utf8 wcs 避免压缩包含中文解压乱码std::wstring wfile_name;constchar*entry_namearchive_entry_pathname(entry);if(entry_name!nullptr)wfile_nameA2WSTR(entry_name);if(wfile_name.empty()){entry_namearchive_entry_pathname_utf8(entry);if(entry_name!nullptr)wfile_nameUTF82WSTR(entry_name);}if(wfile_name.empty()){constwchar_t*wentry_namearchive_entry_pathname_w(entry);if(wentry_name!nullptr)wfile_namewentry_name;}if(wfile_name.empty()){XLOGW(UnZipPack[%s] archive_entry_sourcepath null,UnZipTrackID.c_str());continue;}std::wstring woutfilejeflib::FileUtil::JoinPathW(outputDir,wfile_name);archive_entry_set_pathname_utf8(entry,W2UTF8CSTR(woutfile));nerrarchive_read_extract(ar,entry,ARCHIVE_EXTRACT_TIME|ARCHIVE_EXTRACT_PERM);// 保留文件权限和时间戳constchar*szerrarchive_error_string(ar);XLOGI(UnZipPack[%s] extract file[%s],extract err:%d,errinfo:%s,UnZipTrackID.c_str(),W2ACSTR(woutfile),nerr,szerr?szerr:);}archive_read_close(ar);archive_read_free(ar);XLOGI(UnZipPack[%s] finished,UnZipTrackID.c_str());returntrue;}unrar目前只支持rar格式#includeiostream#includewindows.h#includedll.hpp// unrar库头文件boolExtractRar(constchar*rarPath,constchar*outputDir){RAROpenArchiveDataEx arcData{0};arcData.ArcName(char*)rarPath;// RAR文件路径arcData.OpenModeRAR_OM_EXTRACT;// 解压模式// 打开压缩包HANDLE hArcRAROpenArchiveEx(arcData);if(arcData.OpenResult!0){std::cerr打开失败: arcData.OpenResultstd::endl;returnfalse;}// 逐文件解压RARHeaderDataEx headerData{0};intresult;while((resultRARReadHeaderEx(hArc,headerData))0){// 解压当前文件到目标目录if(RARProcessFile(hArc,RAR_EXTRACT,(char*)outputDir,nullptr)!0){RARCloseArchive(hArc);returnfalse;}}RARCloseArchive(hArc);return(resultERAR_SUCCESS);// 检查是否解压完成}压缩文件egtar.gz格式的压缩包如果不设置filter则默认为tar包intarchiveTar(conststd::vectorstd::stringfpaths,conststd::stringtarpath){structarchive*ararchive_write_new();//设置gzip压缩方式,依赖zlib,文件名需要和filter匹配 get:.tat.gzarchive_write_add_filter_gzip(ar);// 设置格式为 tararchive_write_set_format_gnutar(ar);defer(if(ar)archive_write_free(ar);arnullptr;);intnerrarchive_write_open_filename(ar,tarpath.c_str());if(nerr!ARCHIVE_OK){constchar*szerrarchive_error_string(ar);std::cerr文件打开失败:szerrstd::endl;archive_read_free(ar);returnnerr;}defer(if(ar)archive_write_close(ar););for(autofpath:fpaths){struct_stat64st;if(0_stat64(fpath.c_str(),st)){autoentryarchive_entry_new();defer(if(entry)archive_entry_free(entry);entrynullptr;);archive_entry_set_pathname(entry,fpath.c_str());archive_entry_set_size(entry,st.st_size);if(st.st_modeS_IFREG)archive_entry_set_filetype(entry,AE_IFREG);elseif(st.st_modeS_IFDIR)archive_entry_set_filetype(entry,AE_IFDIR);elsecontinue;archive_entry_set_perm(entry,0644);archive_entry_set_mtime(entry,st.st_mtime,0);// 写入头信息nerrarchive_write_header(ar,entry);if(nerr!ARCHIVE_OK){std::cerr文件打开失败std::endl;returnnerr;}// 写入文件内容FILE*fd_fsopen(fpath.c_str(),rb,_SH_DENYWR);defer(if(fd)fclose(fd);fdnullptr;);if(fd){intlen0;charszbuf[10240];while((lenfread(szbuf,1,10240,fd))0){archive_write_data(ar,szbuf,len);}}}}return0;}demo:std::vectorstd::stringfpaths;fpaths.push_back(d:\\test\\zstd.crs);fpaths.push_back(d:\\test\\zstd.h2);fpaths.push_back(D:\\test\\中文\\zstd.h);fpaths.push_back(D:\\test\\plug\\);archiveTar(fpaths,d:\\test\\zstd.tar.gz);

相关新闻

最新新闻

ntfy 推送通知服务器部署实操:3 条路径选 1 条就够

ntfy 推送通知服务器部署实操:3 条路径选 1 条就够

ntfy 推送通知服务器部署实操:3 条路径选 1 条就够 【免费下载链接】ntfy Send push notifications to your phone or desktop using PUT/POST 项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy ntfy 是一个围绕单次 HTTP 请求构建的推送通知服务器&a…

2026/9/2 12:43:31
yuzu Switch 模拟器完全指南:从安装、配置到性能优化的 7 步实践

yuzu Switch 模拟器完全指南:从安装、配置到性能优化的 7 步实践

yuzu Switch 模拟器完全指南:从安装、配置到性能优化的 7 步实践 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu 是一款用 C 编写的开源任天堂 Switch 模拟器,官方持续维护 Windows、L…

2026/9/2 12:43:31
张雪峰.skill系列总结:从安装到精通的完整认知地图(附全部100篇索引)

张雪峰.skill系列总结:从安装到精通的完整认知地图(附全部100篇索引)

张雪峰.skill系列总结:从安装到精通的完整认知地图(附全部100篇索引) 【免费下载链接】zhangxuefeng-skill 张雪峰.skill — 张雪峰的认知操作系统。高考志愿/考研/职业规划的实战思维框架。由女娲.skill生成。 项目地址: https://gitcode.…

2026/9/2 12:43:31
Carbon 语言:C++ 替代路线上的系统编程实验,从 Hello 到 C++ 互操作的最短路径

Carbon 语言:C++ 替代路线上的系统编程实验,从 Hello 到 C++ 互操作的最短路径

Carbon 语言:C 替代路线上的系统编程实验,从 Hello 到 C 互操作的最短路径 【免费下载链接】carbon-lang Carbon Languages main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see READ…

2026/9/2 12:43:31
CAN学习笔记

CAN学习笔记

特点: 1.传输方式:广播式和请求式 2.高速CAN CAN2.0B 125-1Mbps 40m 低速CAN CAN2.0A 10k-125kbps 1km CAN FD : 8 Mbit/s → 约 40 米 2 Mbit/s → 约 100 米 CAN XL: 最大传输速率: 标准设计目标是 高达 20 Mbit/s,部分实验甚至能更高。 最大传输距离: 同样和速率…

2026/9/2 12:43:31
PHP如何获取当前的URL?

PHP如何获取当前的URL?

在PHP中,要获取当前的URL,你可以使用$_SERVER[REQUEST_URI]这个全局变量。这个变量存储了当前请求的URI(Uniform Resource Identifier,统一资源标识符),也就是浏览器地址栏中显示的网址路径。底层原理是这样…

2026/9/2 12:38:31