最近在iOS开发中遇到解压文件的问题,需要同时支持解压zip和rar文件。
首先说解压zip,用到了ZipZap这个库,地址在这里 ZipZap
解压的过程很顺利,直接调用方法就可以实现
ZZArchive* archive = [ZZArchive archiveWithURL:[NSURL fileURLWithPath:path] error:&error];
如果zip文件下载在本地的话,直接传入本地路径就可以解压成功。
之后用以下方法可以获取zip中的名字
for (ZZArchiveEntry* entry in archive.entries)
{
NSString *fileNameStr = [[NSString alloc] initWithData:entry.rawFileName encoding:enc];
NSArray * arr = [fileNameStr componentsSeparatedByString:@"/"];
NSInteger index = [fileNameStr length]-[[arr lastObject] length];
NSString * aimPath = [fileNameStr substringToIndex:index];
NSError * err;
[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/%@",aimDirection,aimPath] withIntermediateDirectories:YES attributes:nil error:&err];
if (err) {
}
NSData * data = [entry newDataWithError:nil];
[data writeToFile:[NSString stringWithFormat:@"%@/%@",aimDirection,fileNameStr] atomically:YES];
NSString *fileNamePath = [NSString stringWithFormat:@"%@/%@",aimDirection,fileNameStr];
NSMutableDictionary *fileDict = [[NSMutableDictionary alloc]init];
[fileDict setObject:fileNamePath forKey:@"filePath"];
[fileDict setObject:fileNameStr forKey:@"fileName"];
[listArr addObject:fileDict];
}
在 ZZArchiveEntry 中fileName可以获得解压后zip包中的名字,需要注意如果zip中有文件夹的话,返回的名字是 文件夹的名字/文件名字 。
用这种方式解压zip包,包内如果是英文名称是没有问题的,如果是中文名称,则会出现乱码的问题,这是因为GBK编码的问题,此种情况需要对名称进行GBK编码转换
在 ZZArchiveEntry 中有 rawFileName 字段,返回的是NSData数据,利用这个字段来进行GBK转换,具体方法如下
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *fileNameStr = [[NSString alloc] initWithData:entry.rawFileName encoding:enc];
用这种方法转换后,中文名称转换成功,不再乱码,至此解压zip结束。
解压rar使用的第三方库是 UnrarKit这个库,UnrarKit
在使用这个库的时候,我没有采用pod方法添加,而是采用了直接拖入的方式,实现方式是
1.打开下载的UnrarKit项目
2.选择运行的目标为:Generic iOS Device
3.编译工程,将编译好的 UnrarKit.framework 拷贝到你的项目中,如图是需要拷贝的内容,记得要 Show In Finder 中去拷贝
4.在 Embedded Binaries 中引入 UnrarKit.framework
具体使用解压方法如下
- (void)unRarPathStr:(NSString *)pathStr toDestination:(NSString *)aimDirection{
NSError *archiveError = nil;
URKArchive *archive = [[URKArchive alloc] initWithPath:pathStr error:&archiveError];
NSError *error = nil;
NSArray *filenames = [archive listFilenames:&error];
if (error) {
NSLog(@"解压失败");
return;
}
NSFileManager * fileManager = [NSFileManager defaultManager];
NSMutableArray *listArr = [[NSMutableArray alloc]init];
for (NSString *filename in filenames) {
NSArray * arr = [filename componentsSeparatedByString:@"/"];
NSInteger index = [filename length]-[[arr lastObject] length];
NSString * aimPath = [filename substringToIndex:index];
NSError * err;
[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/%@",aimDirection,aimPath] withIntermediateDirectories:YES attributes:nil error:&err];
NSString *fileNamePath = [NSString stringWithFormat:@"%@/%@",aimDirection,filename];
NSData *data = [archive extractDataFromFile:filename progress:nil error:&error];
[data writeToFile:[NSString stringWithFormat:@"%@/%@",aimDirection,filename] atomically:YES];
NSMutableDictionary *fileDict = [[NSMutableDictionary alloc]init];
[fileDict setObject:fileNamePath forKey:@"filePath"];
[fileDict setObject:filename forKey:@"fileName"];
[listArr addObject:fileDict];
}
在使用这个库解压rar的时候并没有遇到中文乱码问题。
解压zip和rar方法实现完毕。