zoukankan      html  css  js  c++  java
  • 使用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等只是进行了转换而已。

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

  • 相关阅读:
    linux shell 脚本攻略学习7---tr命令详解
    linux shell 脚本攻略学习6-xargs详解
    java mail qq邮箱配置 实例
    linux shell 脚本攻略学习5---find命令详解
    linux shell 脚本攻略学习4
    linux shell 脚本攻略学习3
    linux shell 脚本攻略学习2
    java mongodb 基础系列---查询,排序,limit,$in,$or,输出为list,创建索引,$ne 非操作
    linux shell 脚本攻略学习1
    java 获取当前日期和特殊日期格式转换
  • 原文地址:https://www.cnblogs.com/deng37s/p/6874418.html
Copyright © 2011-2022 走看看