最近在一个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等只是进行了转换而已。
本文中的代码是作者项目代码进行一些修改和删减后的片段,不保证能够执行。