当前位置:  开发笔记 > 编程语言 > 正文

iPhone解压缩代码

如何解决《iPhone解压缩代码》经验,为你挑选了3个好方法。

真的坚持尝试编写代码来解压缩iPhone上的文件或目录.

下面是一些示例代码,我用来尝试解压缩一个简单的文本文件.

它解压缩文件但其损坏.

(void)loadView {

    NSString *DOCUMENTS_FOLDER = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *path = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"sample.zip"];

    NSString *unzipeddest = [DOCUMENTS_FOLDER stringByAppendingPathComponent:@"test.txt"];  

    gzFile file = gzopen([path UTF8String], "rb");

    FILE *dest = fopen([unzipeddest UTF8String], "w");

    unsigned char buffer[CHUNK];

    int uncompressedLength = gzread(file, buffer, CHUNK);

    if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength ||     ferror(dest)) {
        NSLog(@"error writing data");
    }
    else{

    }

    fclose(dest);
    gzclose(file);  
}

Sam Soffes.. 41

我想要一个简单的解决方案,但没有找到我喜欢的,所以我修改了一个库来做我想要的.您可能会发现SSZipArchive很有用.(顺便说一下,它也可以创建zip文件.)

用法:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];

这是我见过的最好的解决方案,干得好! (3认同)


schnaader.. 13

"sample.zip"真的是用gZip创建的吗?.zip扩展名通常用于WinZip创建的档案.这些也可以使用zLib解压缩,但您必须解析标头并使用其他例程.

要检查,请查看文件的前两个字节.如果它是'PK',它是WinZip,如果它是0x1F8B,那就是gZip.

因为这是iPhone具体的,看看这个iPhone SDK的论坛讨论,其中miniZip被提及.这似乎可以处理WinZip文件.

但如果它真的是一个WinZip文件,你应该看看WinZip规范并尝试自己解析文件.它基本上应解析一些标头值,寻找压缩的流位置并使用zLib例程对其进行解压缩.



1> Sam Soffes..:

我想要一个简单的解决方案,但没有找到我喜欢的,所以我修改了一个库来做我想要的.您可能会发现SSZipArchive很有用.(顺便说一下,它也可以创建zip文件.)

用法:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];


这是我见过的最好的解决方案,干得好!

2> schnaader..:

"sample.zip"真的是用gZip创建的吗?.zip扩展名通常用于WinZip创建的档案.这些也可以使用zLib解压缩,但您必须解析标头并使用其他例程.

要检查,请查看文件的前两个字节.如果它是'PK',它是WinZip,如果它是0x1F8B,那就是gZip.

因为这是iPhone具体的,看看这个iPhone SDK的论坛讨论,其中miniZip被提及.这似乎可以处理WinZip文件.

但如果它真的是一个WinZip文件,你应该看看WinZip规范并尝试自己解析文件.它基本上应解析一些标头值,寻找压缩的流位置并使用zLib例程对其进行解压缩.



3> Carl Coryell..:

这段代码对我来说非常适合gzip:

数据库是这样编写的:gzip foo.db

关键是循环遍历gzread().上面的例子只读取第一个CHUNK字节.

#import 
#define CHUNK 16384


  NSLog(@"testing unzip of database");
  start = [NSDate date];
  NSString *zippedDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"foo.db.gz"];
  NSString *unzippedDBPath = [documentsDirectory stringByAppendingPathComponent:@"foo2.db"];
  gzFile file = gzopen([zippedDBPath UTF8String], "rb");
  FILE *dest = fopen([unzippedDBPath UTF8String], "w");
  unsigned char buffer[CHUNK];
  int uncompressedLength;
  while (uncompressedLength = gzread(file, buffer, CHUNK) ) {
    // got data out of our file
    if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength || ferror(dest)) {
      NSLog(@"error writing data");
    }
  }
  fclose(dest);
  gzclose(file);
  NSLog(@"Finished unzipping database");

顺便说一下,我可以在77秒内将33MB解压缩到130MB,或者在未压缩/秒内解压缩约1.7 MB.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有