• 使用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等只是进行了转换而已。

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

  • 相关阅读:
    1026: [SCOI2009]windy数 (数位DP)
    Codeforces Round #603 (Div. 2)
    小明种苹果(续)
    1001: [BeiJing2006]狼抓兔子 (最小割)
    codeforces 990C Bracket Sequences Concatenation Problem
    codeforces990D
    codeforces 1037D. Valid BFS?
    pytorch inception v3 KeyError: <class 'tuple'>解决方法
    codeforces 1025C Plasticine zebra
    codeforces1027D
  • 原文地址:https://www.cnblogs.com/deng37s/p/6874418.html
Copyright © 2020-2023  润新知