iOS 之AipArchive压缩和解压

C#中使用ZipArchive压缩文件流 阅读详情

在本教程中,我将演示如何在iOS程序中压缩和解压缩文件。我们将使用一个叫做ZipArchive的第三方库来实现。尽管压缩和解压缩有许多其他的方案可选,但是我觉得ZipArchive库是最快捷、最简单的解决方案。let’s go。


为什么我需要解压缩文件

有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因:


苹果App Store的50M下载限制

苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用户只能下载小于50M的应用或游戏。这样一来,对于一些数据或数据包较大的应用,我们只能尽量减小 应用二进制包的体积。而把数据打包到zip中,这样App可以通过网络下载数据包,解压出所需要的内容,而且这样也可以动态的更新内容。


动态更新内容

这 一点在上面已经提过了。如果应用所需要的资源需要动态更新,一种常见的做法是更新资源,重新打包,重新提交到App store,这样做你需要等待漫长的审核、上架时间。一般情况下是一周左右的时间。更好的方法是将这些资源打包放置在服务器上,App从服务器(或者云存 储)上下载,然后解压。这样做的好处显而易见,那就是可以快速更新,动态更新,不需要重新打包、上传、审核,省时省力。


从Web上下载zip文件

Safari和邮件程序都不支持zip的查看,通过ZipArchive你就可以为你的设备增加查看zip文件的能力了,尽管App Store里已经有一些App支持这些功能了。


工程设置

首先从google code上check out一份代码,svn地址是:http://ziparchive.googlecode.com/svn/trunk/ziparchive-read-only

在终端中输入如下命令即可check out了:

svn co http://ziparchive.googlecode.com/svn/trunk/ziparchive-read-only

或者直接从http://ziparchive.googlecode.com/files/ZipArchive.zip下载。

把minizip文件夹和ZipArchive.h以及ZipArchive.mm文件添加到你的工程中。

因为ZipArchive不支持ARC,所以如果你的工程开启了ARC,那么就需要对ZipArchive设置一下。在ZipArchive.mm编译选项中,增加-fno-objc-arc即可。

最后,需要为工程链接libz动态链接库。

至此,ZipArchive已经集成到你的工程中了,编译工程,应该可以编译成功。可能会有一些警告,这无关紧要,不影响编译。但是作为一个态度严谨的程序员,我强烈建议你看一下这些警告是怎么出现的,解决它们。请记住:在你的工程中,警告应该和错误一样被严肃处理!


下载和解压缩文件

接 下来就向大家展示在你的工程中如何从网上下载zip文件,解压缩,并读取zip压缩包中的文件内容。处于演示考虑,主要的目的是向大家演示 ZipArchive接口的使用方法,所以代码的错误处理和条件检查并没有做过多的考量,在实际的工程中,还是需要大家自己做更为严格的条件检查和错误处 理工作。

示例工程的运行效果如下图:




工 程中只是在ViewController中增加了一个UIImageView和一个UILabel。我们将从网络上下载zip文件,zip文件中包含一张 图片和一个文本文件。下载解压后,图像会被渲染到UIImageView中,而文本会作为UILabel的内容展示。示例代码在文章末尾。希望读者朋友们 自行下载,编译,查看效果。

好,接下来讲一讲具体的实现:


1.引入ZipArchive的头文件。
  1. #import "ZipArchive.h"
复制代码
2.下载zip文件
  1. 1
  2.     dispatch_queue_t queue = dispatch_get_global_queue(
  3.                                                        DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  4.     dispatch_async(queue, ^{
  5.         NSURL *url = [NSURL URLWithString:@"http://www.icodeblog.com/wp-content/uploads/2012/08/zipfile.zip"];
  6.         NSError *error = nil;
  7.         // 2
  8.         NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];

  9.         if(!error)
  10.         {        
  11.             // 3
  12.             NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  13.             NSString *path = [paths objectAtIndex:0];
  14.             NSString *zipPath = [path stringByAppendingPathComponent:@"zipfile.zip"];

  15.             [data writeToFile:zipPath options:0 error:&error];

  16.             if(!error)
  17.             {
  18.                 // TODO: Unzip
  19.             }
  20.             else
  21.             {
  22.                 NSLog(@"Error saving file %@",error);
  23.             }
  24.         }
  25.         else
  26.         {
  27.             NSLog(@"Error downloading zip file: %@", error);
  28.         }

  29.     });
复制代码

上面这段代码的主要作用就是从iCodeBlog上下载一个zip文件,并写入到应用的缓存目录中。

现在zip文件已经下载下来了,接下来就是要解压缩,并将解压缩出来的文件利用起来。


3. 解压缩已下载的zip文件

在第二步中,我们已经把zip文件下载到/Library/Caches/zipfile.zip,现在来解压缩。

把上面代码中的//TODO: Unzip用下面的代码替换掉。

  1. ZipArchive *za = [[ZipArchive alloc] init];
  2. // 1
  3. if ([za UnzipOpenFile: zipPath]) {      
  4.     // 2      
  5.     BOOL ret = [za UnzipFileTo: path overWrite: YES];
  6.     if (NO == ret){} [za UnzipCloseFile];

  7.     // 3
  8.     NSString *imageFilePath = [path stringByAppendingPathComponent:@"photo.png"];
  9.     NSString *textFilePath = [path stringByAppendingPathComponent:@"text.txt"];
  10.     NSData *imageData = [NSData dataWithContentsOfFile:imageFilePath options:0 error:nil];
  11.     UIImage *img = [UIImage imageWithData:imageData];
  12.     NSString *textString = [NSString stringWithContentsOfFile:textFilePath
  13.         encoding:NSASCIIStringEncoding error:nil];

  14.     // 4           
  15.     dispatch_async(dispatch_get_main_queue(), ^{
  16.         self.imageView.image = img;
  17.         self.label.text = textString;
  18.     });
复制代码

对上面的代码做一个简单的解释:


1. 在内存中解压缩文件

2. 将解压缩的内容写到缓存目录中

3. 使用解压缩后的文件

4. 更新UI


非常简单吧!


压缩文件

接下来看一下怎么进行文件压缩。在上面的步骤中,我们已经把一个zip文件解压缩到缓存目录中。现在我们再把解压缩出来的文件重新压缩为一个zip文件,并把这个zip文件写入到Documents目录里去(OMG,这两个文件太惨了,被反复蹂躏)

在示例工程代码中,我已经增加了一个按钮,并和一个IBAction相关联,按钮的处理函数名为zipFilesBUttonPressed:,具体代码如下:

  1. - (IBAction)zipFilesButtonPressed:(id)sender
  2. {
  3.     // 1
  4.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  5.     NSString *docspath = [paths objectAtIndex:0];

  6.     // 2
  7.     paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  8.     NSString *cachePath = [paths objectAtIndex:0];

  9.     // 3
  10.     NSString *zipFile = [docspath stringByAppendingPathComponent:@"newzipfile.zip"];      

  11.     // 4
  12.     ZipArchive *za = [[ZipArchive alloc] init];
  13.     [za CreateZipFile2:zipFile];

  14.     // 5
  15.     NSString *imagePath = [cachePath stringByAppendingPathComponent:@"photo.png"];
  16.     NSString *textPath = [cachePath stringByAppendingPathComponent:@"text.txt"];

  17.     // 6
  18.     [za addFileToZip:imagePath newname:@"NewPhotoName.png"];
  19.     [za addFileToZip:textPath newname:@"NewTextName.txt"];

  20.     // 7
  21.     BOOL success = [za CloseZipFile2];   
  22.     NSLog(@"Zipped file with result %d",success);

  23. }
复制代码

简单解释一下上面代码的意思:


1. 获取Documents目录,新的zip文件要写入到这个目录里。

2. 获取Caches目录,要进行压缩的文件在这个目录里。

3. 获取zip文件的全路径名。

4. 创建一个ZipArchive实例,并创建一个内存中的zip文件。需要注意的是,只有当你调用了CloseZipFile2方法之后,zip文件才会从内存中写入到磁盘中去。

5. 获取要被压缩的文件的全路径

6. 把要压缩的文件加入到zip对象中去,加入的文件数量没有限制,也可以加入文件夹到zip对象中去。

7. 把zip从内存中写入到磁盘中去。

当点击按钮之后,在应用的Documents文件夹下应该有一个叫newzipfile.zip的文件。解压这个文件,就能解压出那两个被反复蹂躏的文件来


结论

现在你知道如何使用ZipArchive来压缩和解压缩文件了。享受ZipArchive的便利吧。示例工程已经很好的展示了这些基本用法,大家可以好好研究下。

使用ZipArchive库在iOS平台上轻松处理zip文件 本文还有配套的精品资源,点击获取 简介: ZipArchive 是iOS开发中用于处理zip文件的广泛使用的开源库,它基于 minizip 库构建,提供了简单的接口和实现代码。本库允许开发者进行文件的压缩和解压缩,同时支持进度回调和错误处理机制。本文将介绍如何使用ZipArchive进行基本的文件压缩、解压操作,并探讨其在安全性和性能优化方面的应... 阅读详情

相关推荐

深度强化学习-D3QN算法原理与代码

Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能。如果对Doubel DQN和Dueling DQN算法还不太了解的话,可以参考我的这两篇博文:深度强化学习-Doubel DQN算法原理与代码和深度强化学习-Dueling DQN算法原理与代码,分别详细讲述了这两个算法的原理以及代码实现。本文就带领大家了解一下D3QN算法,代码链接见下方。 代码:https://github.com/indigo

weixin_46133643的博客 2万+

【读书笔记】ZipArchive 类整理

C#操作zip文件

qq_45222482的博客 1246

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 523

ZipArchive 安装和配置指南

### 项目基础介绍 ZipArchive 是一个用于在 iOS、macOS、tvOS、watchOS 和 visionOS 平台上进行文件压缩和解压缩的简单实用类。它支持多种压缩和解压缩功能,包括创建和解压密码保护的 ZIP 文件、AES 加密的 ZIP 文件等。 ### 主要编程语言 ZipArchive 主要使用以下编程语言: - Objective-C - Swift ## 2. 项目...

gitblog_09176的博客 876

[Pytorch案例实践001]手写MNIST数字识别

Pytorch实现手写数字识别,带完整数据集。

2403_83044722的博客 1114

实战优化!C#上位机串口通信卡顿问题:超时机制+数据缓存方案

串口名</param>/// <param name="baudRate">波特率

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1063

ZipArchive 使用指南

ZipArchive 是一个专为 iOS、macOS 和 tvOS 设计的实用类库,它简化了文件的压缩与解压过程。这个轻量级工具支持最新的 Swift 版本以及Objective-C,基于修改过的 minizip-ng 库(原名minizip),它遵循Zlib许可协议。ZipArchive使得在苹果生态系统中处理ZIP档案变得异常简单,无论是应用程序开发还是系统脚本都能轻松集成。

weixin_45470658的博客 511

因素空间与可拓学的互补性分析及问题处理融合模型

随着知识与信息数量的快速增长以及信息获取便利性的增加,企事业组织所面临的内外部环境更加复杂,业务问题呈现非线性、不确定性、多维化和实时交互性等特点。业务环境的高度不确定性和面临问题的开放性,人工智能与问题处理的深入研究迫切需要有一种自觉地为信息科学与智能科学服务的定性定量相结合的智能数学模型。经典数学适于描述物质世界的数量与空间关系,智能数学必须能描述信息拓展与智能机理。

weixin_70923796的博客 260

iOS中使用ZipArchive 压缩和解压缩文件

引自 http://www.36duo.com/thread-119-1-1.html 在本教程中,我将演示如何在iOS程序中压缩和解压缩文件。我们将使用一个叫做ZipArchive的第三方库来实现。尽管压缩和解压缩有许多其他的方案可选,但是我觉得ZipArchive库是最快捷、最简单的解决方案。let’s go。 为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压

冷胜任 的专栏 1万+

GStreamer Plugin之Gst-nvdewarper

支持三种投影类型 NVDS_META_SURFACE_FISH_PUSHBROOM, NVDS_META_SURFACE_FISH_VERTCYL 和NVDS_META_SURFACE_PERSPECTIVE_PERSPECTIVE。关于每个平面的NvDewarperSurfaceMeta参数(projection_type, surface_index, and source_id)以及内存中有效的矫正平面(num_filled_surfaces)包含RGBA格式的一帧的缓存。矫正后的RGBA格式。

pvmsmfchcs的博客 366

在 Linux 64 位上遭遇 Signal 7 与 ST22 SYSTEM_CORE_DUMPED:从 es/implementation=std 到 /dev/shm 的一套落地排查法

摘要: Linux 64位SAP系统出现SYSTEM_CORE_DUMPED和Signal 7(对应SIGBUS)错误时,核心问题是进程因共享内存资源异常被操作系统强制终止。主要诱因包括:1)/dev/shm的tmpfs默认容量不足(通常仅占物理内存50%);2)SAP内存管理参数es/implementation=map在64位场景下的敏感性。解决方案应双管齐下:在实例profile设置es/implementation=std以降低对tmpfs的依赖,同时按(RAM+Swap)*75%重新配置/dev/

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

推荐开源项目:ZipArchive —— 轻松处理ZIP文件的利器

在iOS和Mac OS X平台开发中,常常会遇到压缩文件的读取和写入需求。ZipArchive是一个强大的Objective-C库,专门为此场景打造,让你能够轻松地对ZIP档案进行操作。它不仅支持基本的读写功能,还包含了ZIP64和BZip2压缩方法的支持。 ## 项目技术分析 ZipArchive基于Gilles Vollant的MiniZip库构建,并由多个贡献者进行了扩展和优化。它的核心...

gitblog_00589的博客 715

防护装备穿戴检查:基于YOLOv8与UI界面的深度学习应用

通过结合YOLOv8模型与UI界面,本系统实现了防护装备穿戴检查的自动化。该系统能够快速识别工作人员是否正确佩戴了所需的防护装备,帮助提高安全管理水平。未来,随着技术的发展,防护装备穿戴检查系统将在更多领域得到应用,如工业现场、建筑工地等,实现更加精确和高效的实时监控。

YOLO 354

使用Objective-C解压缩ZIP文件教程

转自:http://mobile.51cto.com/iphone-283401.htm 使用Objective-C解压缩ZIP文件教程是本文要介绍的内容,主要来学习的是在Objective-C如何来解压缩ZIP文件,来看本文详细内容。 1、首先引入libz.dylib框架 2、到http://code.google.com/p/ziparchive/download

一样的世界,不一样的时间 1880

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

利用ziparchive压缩文件、zip_file解压文件

其实压缩文件就是创建一个通过某种压缩技术生成的文件夹,然后将想要压缩的文件添加进去; 而解压缩文件就是将这个压缩文件夹里的文件取出来,到指定的地方,而这个过程就是相当但是于将这个文件夹里的文件copy到指定地方; 而我们在压缩和解压缩的过程中难免少不了要处理含有中文名的文件,在压缩文件的时候我们不必为其烦忧,但是解压缩文件的时候,你或许会想到ziparchive类里的extract...

de_debug的博客 5202

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

宝塔环境PHP7.3 缺少ZipArchive的问题

宝塔环境PHP7.3 缺少ZipArchive的问题

sinat_21790153的博客 969

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

PHP ZipArchive 大文件分片下载压缩 支持断点续传

函数设置响应头信息,包括文件类型、文件名和文件大小。获取压缩文件的大小,并设置响应头中的文件大小。函数将压缩文件内容输出给浏览器。

weixin_50251467的博客 827

ZipArchive类操作

是专门用于文件的压缩与解压操作的类,通过压缩文件可以达到节省磁盘空间的目的,并且压缩文件体积更小,便于网络传输。1:open(打开一个压缩包文件) 参数说明:第一个参数:要打开的压缩包文件第二个参数: 2:addFile(将指定文件添加到压缩包中) 3:addEmptyDir (将指定空目录添加到压缩包中) 4:addFromString(将指定内容的文件添加到压缩包) 5:extractTO(将压缩包解压到指定目录) 6:getNameIndex(根据索引返回文件名称) 7:getStream(根据压

王兆镇的博客 1807

linux上安装php zip(ZipArchive)、libzip扩展

安装顺序:安装zip(ZipArchive),需要先安装libzip扩展安装libzip,需要先安装cmake按照cmake、libzip、zip的先后顺序安装下面的命令都是Linux命令。

栈外手记|2018 年起深耕后端开发。跳出代码栈,分享技术、项目踩坑与行业思考,看见技术之外更多可能。 1957

文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

总结:                     使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文:PHP如何实现下载功能超详细流程分析 计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话...

weixin_30895603的博客 279

php ,ZipArchive 的使用

获取 zip 文件夹中 pdf 的数量。

jafu_jin的专栏 378

PHP操作ZIP之ZipArchive类以及如何避免生成压缩文件带有目录层级的问题

php ZipArchive可以说是php自带的一个函数了,他可对对文件进行压缩与解压缩处理,但是使用此类之前我们必须在php.ini中把extension=php_zip.dll前面的分号有没有去掉,然后再重启。像这样:D:\xampp\htdocs\xin-card\statics\templates-packages\1679986315\。删除压缩包中的某一个文件,如:deleteIndex(0)删除第一个文件。删除压缩包中的某一个文件名称,同时也将文件删除。添加的文件同时将内容添加进去。

qq_36264795的博客 2387

ZipArchive: 快速、简单易用的 iOS 和 macOS 压缩库

是一个开源的 iOS 和 macOS 库,用于快速地压缩和解压 ZIP 文件。它提供了简单的 API,使开发者能够轻松地将压缩和解压功能集成到自己的应用程序中。 ## 功能特性 ZipArchive 支持以下主要功能: - 支持在 iOS 和 macOS 上压缩和解压 ZIP 文件。 - 提供简单的 API,易于集成到现有项目中。 - 可以从文件系统或数据流中读取和写入 ZIP 文件。 - ...

gitblog_00004的博客 710

tp5 使用 ZipArchive 压缩文件夹

tp5 使用 ZipArchive 压缩文件夹

happy10091812的博客 618
上一篇: Xcode svn import项目 上传.a文件(静态库)
下一篇: iOS 之沙盒
Shicuf
博客等级 码龄16年 11粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值