ZipArchive(解压文件)-程序员宅基地

技术标签: c#  移动开发  c/c++  

一、首先介绍minizip 的使用方法

 

ziparchive是基于开源代码”MiniZip”的zip压缩与解压的Objective-C 的Class,使用起来非常的简单
方法:从http://code.google.com/p/ziparchive/ 上下载ZipArchive.zip,解压后将代码加入工程中,并且把zlib库添加到工程中
使用方法:
1. 压缩:ZipArchive可以压缩多个文件,只需要把文件一一addFileToZip即可.

 

[cpp]  view plain copy
 
  1. ZipArchive* zip = [[ZipArchive alloc] init];  
  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  3. NSString *documentpath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  4. NSString* l_zipfile = [documentpath stringByAppendingString:@"/test.zip"] ;  
  5.    
  6. NSString* image1 = [documentpath stringByAppendingString:@"/image1.jpg"] ;  
  7. NSString* image2 = [documentpath stringByAppendingString:@"/image2.jpg"] ;         
  8.    
  9. BOOL ret = [zip CreateZipFile2:l_zipfile];  
  10. ret = [zip addFileToZip:image1 newname:@"image1.jpg"];  
  11. ret = [zip addFileToZip:image2 newname:@"image2.jpg"];  
  12. if( ![zip CloseZipFile2] )  
  13.   {  
  14.      l_zipfile = @"";  
  15.   }  
  16. [zip release];  



 

 

2. 解压缩:

 

[cpp]  view plain copy
 
  1. ZipArchive* zip = [[ZipArchive alloc] init];  
  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  3. NSString *documentpath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  4.    
  5. NSString* l_zipfile = [documentpath stringByAppendingString:@"/test.zip"] ;  
  6. NSString* unzipto = [documentpath stringByAppendingString:@"/test"] ;  
  7. if( [zip UnzipOpenFile:l_zipfile] )  
  8.  {  
  9.    BOOLret = [zip UnzipFileTo:unzipto overWrite:YES];  
  10.    if( NO==ret )  
  11.    {  
  12.    }  
  13.    [zip UnzipCloseFile];  
  14.  }  
  15. [zip release];  



 

 

以上摘自:http://www.cnblogs.com/a7345678/archive/2012/06/27/2566125.html 暗夜精灵-鬼才阁。 

二、压缩包含中文的文件时,到windows下解压后出现乱码。

这个问题原因是Ios版本的ZipArchive工程中,编码格式变为UTF-8.然后windows上的编码格式多数是GBK。

那么打开ZipArchive的源码,改变编码方式就行了。

找到函数:

 

-(BOOL) addFileToZip:(NSString*) file newname:(NSString*) newname

{

 

 

if( [_passwordlength] ==0 )

{

ret = zipOpenNewFileInZip(_zipFile,

(constchar*) [newnameUTF8String],//UTF-8方式编码

&zipInfo,

NULL,0,

NULL,0,

NULL,//comment

Z_DEFLATED,

Z_DEFAULT_COMPRESSION );

}

}

将上述代码中划线部分,替换为下面部分即可。

 

 (constchar*) [newnamecStringUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)],

 

已经在mac和windows两端测试通过,都可以正常压缩带有中文的文件,并能正常解压。

 

三、解压带有中文或者日文的压缩文件问题

以下转载自:网友:xin88yue   http://www.cocoachina.com/bbs/simple/?t10195.html

原因是:ZipArchive类的解压函数 -(BOOL) UnzipFileTo:(NSString*) path overWrite:(BOOL) overwrite
在遍历压缩文件包,获取包文件的名字处理上存在Bug.

1.  下面两行代码获取包中当前文件的文件名
    unzGetCurrentFileInfo(_unzFile, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
    filename[fileInfo.size_filename] = '\0';  //未尾追加0 结束

        此时获取的文件名是正确的.

2.     但是由char*获取得到NSString*的转换方法使用出错,Mac默认是按UTF8编码的

    //NSString * strPath = [NSString  stringWithCString:filename];       //此处得到的 strPath为空,导致函数返回YES,但目录下无文件

NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
        NSString * strPath = [NSString  stringWithCString:filename encoding:enc];//正确!这个地方应该是跟压缩时的编码对应上才对。

这样就OK了!

转载于:https://www.cnblogs.com/mgbert/p/3993248.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ansion2017/article/details/101833371

智能推荐

一、基于JAVA的GB28181实现之SIP服务_java gb28181-程序员宅基地

文章浏览阅读2.8k次。GB28181定义了了 基于SIP架构的 视频监控互联规范,而对于多数私有协议实现的监控系统如果想接入SIP架构,就要借助网关,GB28181 规范了实现 SIP 监控域与非SIP 监控域互联。最近用JAVA的SIP协议写了一个GB28181平台的对接,并成功完成了海康、大华、中威等设备,更重要的是海康平台、公安一所平台的对接。因为行业内很少有JAVA方面的设备接入实现,希望本篇能够让JAVA在安防接入生态中发挥越来越大的作用。_java gb28181

深入理解操作系统原理之文件系统_磁带设备的主要用途是作为文件系统的后备,存放不常用的信息或用做系统间传送信息-程序员宅基地

文章浏览阅读3.1w次,点赞20次,收藏154次。一、概述操作系统对系统的软件资源(不论是应用软件和系统软件)的管理都以文件方式进行,承担这部分功能的操作系统称为文件系统。1、文件计算机系统对系统中软件资源:无论是程序或数据、系统软件或应用软件都以文件方式来管理。文件是存贮在某种介质上的(如磁盘、磁带等)并具有文件名的一组有序信息的集合。 文件名是由字符和数字组成的,例如MS-DOS中文件名由三部分组成,格式如下:[] [._磁带设备的主要用途是作为文件系统的后备,存放不常用的信息或用做系统间传送信息

ipadpro编写java代码_iPad Pro变生产力工具,你还缺个轻量级浏览器端代码编辑器...-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏15次。本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。注意,这篇文章就是在劝你买iPad Pro(手动狗头)~最近,苹果推出了新的iPad Pro,号称生产力工具。然而对程序员来说,不能写代码,就难以称得上生产力。虽然也有一些优秀的写代码App可供程序员使用,但本着能不花钱就不花钱的原则,还是可以去找一些开源软件。于是乎,现在有一款免费的浏览器端代码编辑器CodeJar,值得..._ipad写代码软件java

Elasticsearch学习--2 安装es、kibana、分词器_kibana查看索引分词器-程序员宅基地

文章浏览阅读418次。ES的安装下载地址https://www.elastic.co/cn/downloads/past-releases#elasticsearch示例下载的6.2.4版本慢的话,可以去华为云镜像下载,速度杠杠的https://mirrors.huaweicloud.com/elasticsearch/安装步骤前置环境:centos7、jdk1.81、保证有linux的非root用户es不能通过root用户启动,会报错;如果没有,新建用户,命令如下:新建用户:useradd xxxx _kibana查看索引分词器

1.Echarts设置图例数值和名称样式不同_echarts series name 怎么设置不同的值-程序员宅基地

文章浏览阅读223次。Echarts设置图例数值和名称样式不同_echarts series name 怎么设置不同的值

Nodejs项目部署到华为云服务器并上线超详细教程_nodejs服务器-程序员宅基地

文章浏览阅读674次,点赞26次,收藏7次。由于是第一次做Nodejs项目,发现网上关于Nodejs项目部署服务器的教程的质量参差不齐,对于初学者很不友好,看了一堆教程,最后还是不会,一头雾水,所以决定自己写一个详细教程,方便以后学习查看并记录。废话不多说,正文正式开始;_nodejs服务器

随便推点

python随机库中几个实用随机函数的使用_1.data = randomnumbers(10, 1, 100)功能是什么?-程序员宅基地

文章浏览阅读345次。import randoma=random.randint(10,100)#生成一个1-100的随机数b=random.randrange(10,100,10)#生成一个10-100步长为10的随机整数c=random.getrandbits(16)#生成一个16比特的随机整数d=random.uniform(10,100)#生成一个1-100的随机小数e=random.choice([1,2,3,4,5,6,7,8])#从序列中随机选择一个数f=random.random()#生成一个0-._1.data = randomnumbers(10, 1, 100)功能是什么?

前端项目部署后,如何提示用户版本更新_前端通知用户更新-程序员宅基地

文章浏览阅读8k次,点赞93次,收藏86次。项目部署上线后,特别是网页项目,提示正在操作系统的用户去更新版本非常important。一般我们都会用“刷新大法”来清理缓存,但是对于正在操作网页的用户,不造系统更新了,请求的还是老版本的资源。为了确保用户能够及时获得最新的功能和修复的 bug,我们需要通知用户刷新页面获取最新的代码。_前端通知用户更新

DOM Based Cross Site Scripting or XSS of the Third Kind_the application may be vulnerable to dom-based dom-程序员宅基地

文章浏览阅读2k次。SummaryWe all know what Cross Site Scripting (XSS) is, right? It’s that vulnerability wherein one sends malicious data (typically HTML stuff with Javascript code in it) that is echoed back later by _the application may be vulnerable to dom-based dom data manipulation. data i

Vue3父子组件emit参数传递(解决Vue2this.$emit无效问题)_vue3 this.$emit-程序员宅基地

文章浏览阅读2.4w次,点赞13次,收藏24次。之前写了一篇Vue3路由跳转问题的博客,发现还是有很多同学对基本的使用改变还没有了解,于是我就顺道把常用的组件间传递的方式也写一下吧.......注意的是:1.Vue3中不在强调this的使用,可以说你在setup中完全不能用this,不像Vue2中把全部的内容都集成到this中。2.Vue3现在由于compositionAPI的方式可以说是弱化了Vuex的存在(当然Vuex现在可以用没什么变化)。3.如果您有Vue2的开发经历,用Vue3也不会特别陌生,会很快上手。目录1.解决._vue3 this.$emit

Unity与C++网络游戏开发实战:基于VR、AI与分布式架构 【1.3】_unity分布式仿真-程序员宅基地

文章浏览阅读610次,点赞18次,收藏9次。C#语言从本质上来说是在C++语言的基础上衍生出来,它是基于托管生成和指针管理的一种面向对象的编程语言。相比C++语言,它是一门更加简单、安全和易于学习的语言。它继承了C++语言强大的功能,摒弃了一些C++语言里比较复杂的使用方法,比如去掉了宏模板多重继承这些复杂的概念。C#语言借用了Visual Basic语言的可视化编程方法,基于.NET的开发库,开发了一套C#使用的可视化编程库,让C#语言,既拥有C++语言的强大能力,也更加人性化,让开发人员更加易于上手。C#语言具有以下特性:·语言简洁。_unity分布式仿真

推荐文章

热门文章

相关标签