在不解压zip文件的情况下肚去其中的文件,因为之前使用的ziparchive不能满足现在的需求
在终端输入:pod search zip zap,可以搜到当前的最新版本的(适应xcode的最新版本,若xcode不是最新的可以降低版本),然后添加进Podfile,再运行一下pod update --no-repo-update就可以添加到自己的工程当中了
在需要的地方添加#import<ZipZap/ZipZap.h>就可以了。
用法
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__);
}else{
return [UIImage imageWithData:data];
}
}
}
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] - 1 - [[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;
}