最近在公司遇到一项需求,在不解压zip文件的情况下读取其中的文件,因为之前使用的ziparchive不能满足现在的需求,所以在网上一阵狂搜,终于找到了zipzap,实话说还真的难找。

之前读取本地zip文件的内容时会把它解压出来,运行app之后会发现原来的zip文件被同名文件夹取代,使用zipzap之后便不会再有这种情况,另外自己还可以根据需要把读取的文件写入某个文件夹。

只需要在终端输入:pod search zipzap ,回车就可以找到它的当前版本,然后添加进Podfile,再运行一下pod update --no-repo-update就可以把它添加进自己的工程了。

在需要使用的地方添加 #import <ZipZap/ZipZap.h> 就可以使用了,是不是很方便?

下面介绍一下zipzap的四种使用场景:

1、从zip中读取已知内容[即你知道所需要文件的文件名]

//把zip数据包转换成ZZArchive对象
 ZZArchive *archive = [ZZArchive archiveWithURL:[NSURL fileURLWithPath:zip] error:&error];
//zip中的数据都在archive 的 [NSArray]entries属性中,
//所以可以通过for循环,或者NSArray自带的方法遍历entries中的元素获取自己想要的结果
//通常情况下我们只知道所需资源的名字,这样就可以使用下面的代码来实现
     for (ZZArchiveEntry * ectry in archive.entries) {
if ([ectry.fileName isEqualToString:name]) {
NSData * data = [ectry newDataWithError:&error];
if (error) {
// NSLog(@"--------data error:%@--------\n %s",error,__FUNCTION__);
6 }else{
7 return [UIImage imageWithData:data];
8 }
9 }
}

  //上面的代码只是从一个zip包中取出对应的图片,如果zip中的文件有一定的目录结构,大家可以打印一下ectry.fileName看看是什么样子,看过之后就会明白了

2、向zip包中添加内容

 ZZArchive* newArchive = [[ZZArchive alloc] initWithURL:[NSURL fileURLWithPath:@"/tmp/new.zip"] options: @{ZZOpenOptionsCreateIfMissingKey: @YES} error:nil];

 [newArchive updateEntries:
              @[
               [ZZArchiveEntry archiveEntryWithDirectoryName:@"folder/"],
              [ZZArchiveEntry archiveEntryWithFileName:@"folder/first.text"
               compress:YES
               dataBlock:^(NSError** error){
                                 return [@"hello, world" dataUsingEncoding:NSUTF8StringEncoding];
                                }]
              ]
error:nil];

3、更新zip包中的内容

ZZArchive* archive = [ZZArchive archiveWithURL:[NSURL fileURLWithPath:@"/tmp/old.zip"] error:nil];
NSMutableArray* entries = [archive.entries mutableCopy];
[entries replaceObjectAtIndex:replacingIndex
withObject: [ZZArchiveEntry archiveEntryWithFileName:@"replacement.text"
compress:YES
dataBlock:^(NSError** error){
return [@"see you again, world" dataUsingEncoding
}]];
[archive updateEntries:entries error:nil];

  

4、解压zip包

//path : zip路径
//aimDirection : 解压到什么位置
//如果解压成功,则返回YES,否则返回NO
 + (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)aimDirection{
NSError * error;
ZZArchive* archive = [ZZArchive archiveWithURL:[NSURL URLWithString:path] error:&error];
if (error) {
return NO;
} NSFileManager * fileManager = [NSFileManager defaultManager]; for (ZZArchiveEntry* entry in archive.entries)
{
if (!entry.fileMode || !S_IFDIR)
{
// Some archives don't have a separate entry for each directory
// and just include the directory's name in the filename.
// Make sure that directory exists before writing a file into it.
NSArray * arr = [entry.fileName componentsSeparatedByString:@"/"]; NSInteger index = [entry.fileName length] - - [[arr lastObject] length]; NSString * aimPath = [entry.fileName substringToIndex:index]; NSError * err;
[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/%@",aimDirection,aimPath] withIntermediateDirectories:YES attributes:nil error:&err];
if (err) {
return NO;
} NSData * data = [entry newDataWithError:nil];
[data writeToFile:[NSString stringWithFormat:@"%@/%@",aimDirection,entry.fileName] atomically:YES];
}
} [fileManager removeItemAtPath:path error:nil];
return YES;
}

iOS zipzap读取压缩文件的更多相关文章

  1. Java学习笔记之I/O流(读取压缩文件以及压缩文件)

    1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给Buf ...

  2. perl 利用管道读取压缩文件内容

    perl的文件句柄不仅支持普通文件, 还支持管道,今天需要统计一个fastq文件中的序列数和碱基数,而NGS的fastq文件一般都是gzip压缩的,所以 需要读取压缩文件中的内容,代码如下: my ( ...

  3. C# 读取压缩文件方式及乱码处理

    目前主流的压缩文件操作类,除了C#原生的.还有 1. ZIP-DotNetZip 网址:http://dotnetzip.codeplex.com/ 2 7Zip-SevenZipSharp 网址:h ...

  4. iOS开发读取plist文件、iphone中plist文件的

    在Xcode中建立一个iOS项目后,会自己产生一个.plist文件,点击时会看见它显示的是类似于excel表格: 但是,如果打开方式选择Source Code,你会看见它其实是一个xml文件. 我们会 ...

  5. Java读取压缩文件信息

    不解压压缩文件,获取其中包含的文件,通过文件名检查是否包含非法文件.(后续再根据文件头或内容吧) zip: import java.util.zip.ZipEntry;import java.util ...

  6. 自制 COCO api 直接读取类 COCO 的标注数据的压缩文件

    第6章 COCO API 的使用 COCO 数据库是由微软发布的一个大型图像数据集,该数据集专为对象检测.分割.人体关键点检测.语义分割和字幕生成而设计.如果你要了解 COCO 数据库的一些细节,你可 ...

  7. C# 压缩文件与字节互转

    public class ZipBin { public byte[] bytes; //C#读取压缩文件(将压缩文件转换为二进制 public void GetZipToByte(string in ...

  8. linux 压缩文件的命令总结

    Linux压缩文件的读取 *.Z       compress 程序压缩的档案: *.bz2     bzip2 程序压缩的档案: *.gz      gzip 程序压缩的档案: *.tar     ...

  9. C#利用SharpZipLib解压或压缩文件夹实例操作

    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode. ...

随机推荐

  1. HDOJ-ACM1022(JAVA)

    这道题:是模拟出栈,判断出栈顺序的可能性. 基本上大家的做法都是直接模拟栈的出栈入栈并将顺序用0,1序列来表示,我暂时没想到什么好的思路. import java.util.*; import jav ...

  2. HDOJ-ACM1012(JAVA)

    这道题很简单,主要是弄懂题意和注意输出: 输出的完整结果如下: n e - ----------- 0 1 1 2 2 2.5 3 2.666666667 4 2.708333333 5 2.7166 ...

  3. algorithm@ KMP

    一. KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,简称KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与 ...

  4. Asp.net多行文本框随内容增加而高度增加

    最近做一个项目,在一个多行文本框(TextBox)里显示新闻内容,由于内容有多有少,并且总是出现垂直滚动条,很不好看,笔者就想用一个法子,去掉垂直滚动条,并且文本框的高度随内容的增加而变大,使高度适应 ...

  5. linux命令之cat

    转自:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...

  6. iOS开发 落地消息多的处理办法(仅供参考)

    1.首先要知道一点,你的消息储存是用数据库储存的! 看了一下微信和qq的消息处理,一般情况下第三方(亲加,容云,环信都会有本地的数据库)处理过的! 但是我发现,最近一个需求要求开发@"消息已 ...

  7. eclipse 插件之Code Folding

    功能: eclipse自带折叠包括方法, import, 注释等得折叠功能, code folding 插件对其增强. 1. 下载插件:( 也可以用link方式, 我的是link安装, jar包网上很 ...

  8. Count属性(行数 @)

    在PS2.0中,如果返回值为空,则count也会返回空(vm.txt内容为空),如下: (gc d:\vm.txt).count 如果加上@的话,会返回0 @(gc d:\vm.txt).count ...

  9. Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯

    网上的TextView做跑马灯,大多都是要用到焦点,而且字数要超出滚动区域宽度才能实现滚动,使用起来十分不方便. 这里实现一种真正可控的滚动 (1)不需要焦点 (2)任意字数 (3)滚动从滚动区域右边 ...

  10. linux和windows中设置环境变量经常使用命令

    Linux和Windows下查看环境变量方法 一.查看全部环境变量的名称和值: Linux下:export Windows下:set 二.依据名称查该环境变量的值: Linux下:echo $环境变量 ...