使用Objective-Zip解压Zip文件<转>

 最近在一个iOS项目中需要对Zip文件进行解压缩,发现了一个很好用的包——Objective-Zip(http://code.google.com/p/objective-zip/),Objective-Zip将Zlib和MiniZip用Objective-C进行了封装,使用起来非常简单。

      下载Objective-Zip以后解压出来,将其中的三个文件夹Zlib、MiniZip、Objective-Zip添加到Xcode项目中,就可以使用Objective-Zip进行解压了!当然了,肯定还需要import一些头文件才行。一般至少需要包含ZipFile.h和FileInZipInfo.h, 解压缩需要ZipReadStream.h,压缩文件需要ZipWriteStream.h。我为了方便写了个头文件,把它们全包含进去,这样只需要import我写的头文件就行。

 

一、解压缩Zip文件

ZipFile *zFile = [[ZipFile alloc] initWithFileName:fileInPath mode:ZipFileModeUnzip];

//mode指示打开zip文件的用途,在ZipFile.h中定义,一共三种模式,ZipFileModeUnzip是解压模式(读模式),ZipFileModeCreate创建并写入压缩文件(写模式),ZipFileModeAppend不用说就是追加模式喽。

if (zFile == nil) ……

//接下来就是读取了:

[zFile goToFirstFileInZip];

//首先需要进入Zip包中的第一个文件,然后就可以遍历读取zip包中的所有文件

BOOL bContinue; 

while (bContinue) {

FileInZipInfo *fInfo = [zFile getCurrentFileInZipInfo];

//获得当前遍历文件的信息,包括大小、文件名、压缩级等等

ZipReadStream *readStream = [zFile readCurrentFileInZip];

//将当前文件读入readStream,如果当前文件有加密则使用readCurrentFileInZipWithPassword

NSMutalbeData *data = [[NSMutableData alloc] initWithLength:info.length];

//发现data的长度给的不对就要出问题,所以用文件大小初始化

[readStream readDataWithBuffer:data];

[readStream finishedReading];

//将当前文件内容存入data中,怎么处理就看具体情况了

bContinue = [zFile goToNextFileInZip];

//如果包中没有文件了,返回NO,结束遍历

}

[zFile close];

//最后别忘了close,随手关门是个好习惯

 

除了顺序读取外还可以指定读取某个文件:

[zFile locateFileInZip:filename]; //将当前文件游标指向指定文件

如果想知道zip文件中有哪些文件,可以使用下面的代码:

NSArray  *infoAry = [zFile listFileInZipInfos];

获得所有文件信息

 

二、压缩文件

ZipFile *zFile = [[ZipFile alloc] initWithFileName:fileInPath mode:ZipFileModeCreate];

//向当前Zip文件中添加文件需要使用ZipFileModeAppend模式

ZipWriteStream *writeStream = [zFile writeFileInZipWithName:yourfilename compressionLevel:ZipCompressionLevelFast];

//yourfilename是存入的文件名

//compressionLevel指示压缩率级别,可以选择ZipCompressionLevelFast(最快), ZipCompressionLevelBest(最大压缩率),ZipCompressionLevelNone(不压缩)

//如果使用密码和CRC校验可以使用另外的写入函数

[writeStream writeData:data];

//data是需要压入的文件内容(NSData类型)

[writeStream finishedWriting];

[zFile close];

 

三、提示

关于子目录的问题,zip文件中子目录的文件名包含了目录信息,例如folder文件夹中有个a.tx文件,那么这个文件在zip文件中实际的文件名就是folder/a.txt,所以你解压获得的文件就是folder/a.txt,一些解压缩软件Winzip等只是进行了转换而已。

本文中的代码是作者项目代码进行一些修改和删减后的片段,不保证能够执行。

posted @ 2017-05-18 17:14  D飞翔的猫  阅读(307)  评论(0编辑  收藏  举报