使用SSZipArchive OBJ-C解压缩.sqlite文件

时间:2015-01-05 13:21:35

标签: ios objective-c sqlite unzip ssziparchive

我需要从服务器下载.zip文件,并在解压缩后使用它进行投影。我已成功下载.sqlite文件,我可以使用右键单击(手动)提取它但当我尝试使用minizip和SSZipArchive或ZipArchive提取它时,它会发出错误" Can&#39 ;打开文件"。

如果我手动提取.sqlite并通过右键单击mac来压缩.sqlite文件,那么我的代码将完全解压缩,但每当我尝试直接提取下载的文件时,就会出现此问题。

我已经应用了以下名称格式来编写和提取文件。

  1. 在编写文件时,名称为XYZ.sqlite.zip,但也出现错误
  2. XYZ.zip和包含的文件名是XYZ.sqlite。这也给出了错误
  3. 我还有一个名为XYZ.sqlite.zip的文件,然后用XYZ.zip重命名然后提取,但这也无效。
  4. 以下是代码。

    用于下载文件:

     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:zipURL]];
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:[zipURL lastPathComponent]];
    operation = [[AFDownloadRequestOperation alloc] initWithRequest:request targetPath:path shouldResume:YES];
     [operation.securityPolicy setAllowInvalidCertificates:YES];
     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
     [self unzipDBFile:path];
    
    
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    
    [operation setProgressiveDownloadProgressBlock:
     ^(AFDownloadRequestOperation *operation, NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile) {
    
         NSArray *progress = [NSArray arrayWithObjects:obj_Pro,[NSNumber numberWithFloat:totalBytesReadForFile/(float)totalBytesExpectedToReadForFile], nil];
    
         [self performSelectorOnMainThread:@selector(updateProgressBar:) withObject:progress waitUntilDone:NO];
     }];
    [operation start];
    

    用于提取文件:

    -(void)unzipDBFile:(NSString *)filePath
    {
    
     NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                 NSUserDomainMask, YES) objectAtIndex:0];
       NSString *outputPath = [documentDir stringByAppendingPathComponent:@"/DBFolder"];
       BOOL isExtracted =[SSZipArchive unzipFileAtPath:outputPath toDestination:documentDir];
    
      // NSString *filepath = [[NSBundle mainBundle] pathForResource:@"ZipFileName" ofType:@"zip"];
     //    ZipArchive *zipArchive = [[ZipArchive alloc] init];
     //    [zipArchive UnzipOpenFile:filePath];
    
     //    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //    NSString *path = [paths objectAtIndex:0];
    //    BOOL isExtracted=[zipArchive UnzipFileTo:path overWrite:YES];
    //    NSLog(@"PATH=%@",path);
       if (!isExtracted)
        {
         UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Error in extracting" message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
          [alert show];
          [alert release];
       }else{
         UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Extract Success" message:@"" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
         [alert show];
         [alert release];
       }
    //    [zipArchive UnzipCloseFile];
    //    [zipArchive release];
    }
    

    以下是更新进度条的代码:

    - (void)updateProgressBar:(NSArray *)progress
    {
     UIProgressView *pgr = (UIProgressView *)[progress objectAtIndex:0];
     [pgr setProgress:[[progress objectAtIndex:1] floatValue]];
    }
    

1 个答案:

答案 0 :(得分:0)

我已经检查了这个问题并发现.net开发人员,创建.zip的人使用了gzip压缩,因此minizip无法提取它。

为了解压缩它,我使用了iOS zlib框架和下面的代码,这解决了我的问题。在实现此方法之前,您必须在标题中添加以下两项内容。

#import <zlib.h>
#define CHUNK 16384

-(BOOL)unzipDBFile:(NSString *)filePath
{
NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask, YES) objectAtIndex:0];
documentDir=[documentDir stringByAppendingPathComponent:DATABASE_FILE_NAME];

    gzFile file = gzopen([filePath UTF8String], "rb");
    FILE *dest = fopen([documentDir 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)) {

            return FALSE;
        }
    }
    fclose(dest);
    gzclose(file);

return TRUE;
}