美文网首页
iOS解压zip和rar文件

iOS解压zip和rar文件

作者: _相信未来_ | 来源:发表于2020-08-20 15:41 被阅读0次

最近在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 中去拷贝


142772-99b0318db1476b1d.png

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方法实现完毕。

iOS中加载word以及各类文档

相关文章

网友评论

      本文标题:iOS解压zip和rar文件

      本文链接:https://www.haomeiwen.com/subject/ylosjktx.html