iOS ::如何使用GZIP Utility解压缩.gz文件?

时间:2015-07-13 09:27:23

标签: ios objective-c iphone ios8

我将sqlite数据库保存在.gz格式的S3服务器中。 当我的iOS应用程序启动时,我想在.gz文件中下载数据库并将其解压缩到文档目录中。

下载部分工作正常,但解压缩无效。

我尝试过ZipArchive,但它没有解压缩.gz文件。它能够解压缩ZIP文件。下面是代码,我试过了。

 ZipArchive *za = [[ZipArchive alloc] init];

if ([za UnzipOpenFile:filePath]) {
    BOOL ret = [za UnzipFileTo:destPath overWrite:YES];
    [za UnzipCloseFile];
    [za release];

    if (ret == YES) {
        [self stopSpinner];

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[appDelegate encTitle] message:@"Update successful.\nPlease restart the application for changes to take effect." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alert show];
                [alert release];
            } else {
                //Didn't work
            }
        }

我在iOS中发现GZIP用于解压缩,但是没有任何想法可以使用它。如果有人有想法,请与我分享。 GZIP的链接:: https://github.com/nicklockwood/GZIP

如果有人知道.gz解压缩的任何其他库.....他们也欢迎。

2 个答案:

答案 0 :(得分:2)

您在使用GZIP库时遇到什么困难?

您需要做的只是在gunzippedData实例上调用NSData,它将返回一个包含解压缩数据的新NSData对象。

<强>更新

GZIP库不适用于文件,但它直接适用于NSData的实例。这意味着您必须手动construct an NSData object from your compressed .gz file,解压缩它,并write the uncompressed data到文档目录...

// assuming filePath is a valid local path to the .gz file
NSError *error = nil;

// Create an NSData instance from the file
NSData *compressedData = [NSData dataWithContentsOfFile:filePath options:0 error:&error];
if (!compressedData) {
    NSLog(@"Reading file failed: %@", error);
}
else {
    // Attempt to uncompress it
    NSData *uncompressedData = [compressedData gunzippedData];
    if (!uncompressedData) {
        NSLog(@"Decompression failed");
    }
    else {
        // Write the uncompressed data to disk
        // You will need to set pathToSQLiteFile to the desired location of the SQLite database
        [uncompressedData writeToFile:pathToSQLiteFile atomically:YES];
    }
}

答案 1 :(得分:0)

我围绕着Apple自己的压缩库DataCompression维护了一个轻量级的 Swift 3 + 包装器库。除其他外,它还支持 GZIP 格式。

解压缩 .gz 文本文件并打印内容看起来像这样:

import DataCompression

let compressedData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/your/file.txt.gz"))

if let uncompressedData = compressedData?.gunzip() {
    print(String(data: uncompressedData, encoding: .utf8) ?? "Can't decode UTF-8")
}

有关接口和其他压缩格式的完整概述,请参考README