iOS之SSZipArchive压缩和解压缩

来源:互联网 发布:诺基亚 x311玩java 编辑:程序博客网 时间:2024/06/08 12:05

本文参考来源:http://blog.csdn.net/confidantplayboy/article/details/37657833


简介:

SSZipArchive是一个能快速简洁地实现压缩和解压缩的第三方类库。


解压zip文件

解压密码保护的zip文件

创建zip文件

追加zip文件

压缩文件

以一个filename zip一段

NSData可以在ARC和非ARC的工程中使用


1.把SSZipArchive.h, SSZipArchive.m,minizip添加到你的工程当中



2.添加libz类库到target



3.代码实现

压缩与解压缩路径:

#define DOWNLOADFILEPATH [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename]#define UNZIPPATH  [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]


开始解压缩

-(void)beginDownLoadZip:(NSString *) urlStr {        NSURL *url = [NSURL URLWithString:urlStr];                NSURLRequest *request = [NSURLRequest requestWithURL:url];                /*         第一个参数:配置信息 [NSURLSessionConfiguration defaultSessionConfiguration]         第二个参数:代理         第三个参数:设置代理方法在哪个线程中调用         */        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];                NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];                [dataTask resume];    }

遵守协议<NSURLSessionDataDelegate>并实现


/** *  1.接收到服务器的响应 它默认会取消该请求 * *  @param session           会话对象 *  @param dataTask          请求任务 *  @param response          响应头信息 *  @param completionHandler 回调 传给系统 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{    //获得文件的总大小    _totalSize = response.expectedContentLength;    NSLog(@"response====%@",response.suggestedFilename);        _zipName = [[response.suggestedFilename componentsSeparatedByString:@"."] objectAtIndex:0];        _zipVersion = [[_zipName componentsSeparatedByString:@"_"] objectAtIndex:1];        self.unZipPath = [NSString stringWithFormat:@"%@/%@",UNZIPPATH,_zipName];        //获得文件全路径    self.fullPath = DOWNLOADFILEPATH;        //创建空的文件    [[NSFileManager defaultManager]createFileAtPath:self.fullPath contents:nil attributes:nil];        //创建文件句柄    self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];        [self.handle seekToEndOfFile];        /*     NSURLSessionResponseCancel = 0,         取消 默认     NSURLSessionResponseAllow = 1,          接收     NSURLSessionResponseBecomeDownload = 2, 变成下载任务     NSURLSessionResponseBecomeStream        变成流     */    completionHandler(NSURLSessionResponseAllow);}/** *  接收到服务器返回的数据 调用多次 * *  @param session           会话对象 *  @param dataTask          请求任务 *  @param data              本次下载的数据 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{        //写入数据到文件    [self.handle writeData:data];        //计算文件的下载进度    self.currentSize += data.length;    NSLog(@"%f",1.0 * self.currentSize / self.totalSize);}/** *  请求结束或者是失败的时候调用 * *  @param session           会话对象 *  @param dataTask          请求任务 *  @param error             错误信息 */-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{    //关闭文件句柄    [self.handle closeFile];        self.handle = nil;        if (error == nil) {            }    NSLog(@"_unZipPath==%@",_unZipPath);        //下载成功后根据url保存路径到本地    //下载完成自动解压文件,成功删除压缩文件,不成功再次解压    if ([SSZipArchive unzipFileAtPath:_fullPath toDestination:_unZipPath]) {                NSLog(@"成功解压");                //删除压缩包        [[NSFileManager defaultManager] removeItemAtPath:_fullPath error:nil];                //保存解压文件的路径和版本号,文件名,根据url保存路径到本地        [_zipDictionary setObject:_unZipPath forKey:@"unZipPath"];                [_zipDictionary setObject:_zipVersion forKey:@"zipVersion"];                [_zipDictionary setObject:_zipName forKey:@"zipName"];                NSUserDefaults *defualts = [NSUserDefaults standardUserDefaults];                [defualts setObject:_zipDictionary forKey:@"ZipPackage"];                [defualts synchronize];                [self.delegate getUnZipFilePath:_unZipPath];            }    else{        NSLog(@"解压失败");    }}


在需要解压的地方调用下面的方法:


//判断本地是否有解压文件- (void)isExistZip{        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        NSDictionary *unZipDic = [defaults objectForKey:[DOWNLOGIN md5String]];        _unZipPath = [unZipDic objectForKey:@"unZipPath"];        if (_isExist) {                NSString *file = self.htmlFile;                NSURL *url =[NSURL URLWithString:file];                NSURLRequest *request = [NSURLRequest requestWithURL:url];                dispatch_after(2.0,dispatch_get_main_queue(), ^{                        [self.loginWebView loadRequest:request];        });          }    else{                ATBZipTool *zip = [[ATBZipTool alloc] init];                zip.delegate = self;                NSFileManager *fileManager = [NSFileManager defaultManager];                if ([fileManager isExecutableFileAtPath:_unZipPath]) {                        NSString *file = [NSString stringWithFormat:@"file://%@/Login.html",_unZipPath];                        NSURL    *url =[NSURL URLWithString:file];                        NSURLRequest *request = [NSURLRequest requestWithURL:url];                        [self.loginWebView loadRequest:request];        }        else        {            [zip beginDownLoadZip:@"http://XXX.XXX.XXX.XXX.zip"];        }            }        }

/** *  解压路径 */-(void) getUnZipFilePath:(NSString *)filePath{        _unZipPath = filePath;        //设置请求    NSString *file = [NSString stringWithFormat:@"file://%@/Login.html",filePath];        NSLog(@"file==%@",file);        NSURL    *url =[NSURL URLWithString:file];        NSURLRequest *request = [NSURLRequest requestWithURL:url];        [self.loginWebView loadRequest:request];        //请求成功删除压缩包    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        NSDictionary *unZipDic = [defaults objectForKey:[DOWNLOGIN md5String]];        NSString *zipName = [unZipDic objectForKey:@"zipName"];        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];        NSString *zipPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.zip",zipName]];        NSFileManager *fileManager = [NSFileManager defaultManager];        [fileManager removeItemAtPath:zipPath error:nil];}



0 0
原创粉丝点击