如何使用Objective C创build一个zip文件?

我正在开发一个iOS应用程序,并试图压缩我在应用程序中创build的文件,是否有任何内置函数能够做到这一点?

正如Alex指出的那样,我通过指出Cocoadev wiki用户贡献的NSData类来回答这个问题 。 该类别包括在NSData实例中处理压缩和压缩数据的方法(可以从Zip文件读取或写入一个)。 这应该是所有你需要实现的文件压缩你描述,只要你可以喂你的文件数据到一个NSData实例。

有关此类别实例的示例,请参阅我的iPhone应用程序Molecules的源代码。 我只使用该方法从gzip文件(SLSMolecule + PDB.m)中提取数据,但是您应该能够从中获得基本概念。

我绝对推荐Objective-Zip。 它刚刚转移到https://github.com/flyingdolphinstudio/Objective-Zip

他们的文档中的一些例子:

创build一个Zip文件:

ZipFile *zipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeCreate]; 

将文件添加到zip文件:

 ZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt" compressionLevel:ZipCompressionLevelBest]; [stream writeData:abcData]; [stream finishedWriting]; 

从zip文件读取文件:

 ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeUnzip]; [unzipFile goToFirstFileInZip]; ZipReadStream *read= [unzipFile readCurrentFileInZip]; NSMutableData *data= [[NSMutableData alloc] initWithLength:256]; int bytesRead= [read readDataWithBuffer:data]; [read finishedReading]; 

首先从http://code.google.com/p/objective-zip/downloads/list下载Objective-zip示例;

在这个例子中find并复制三个文件夹Objective-Zip,MiniZip和ZLib拖到你的项目

在你的.m类中导入两个类“ZipFile.h”和“ZipWriteStream.h”

创buildzip的方法我的代码是: –

 -(IBAction)Zip{ self.fileManager = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory , NSUserDomainMask, YES); NSString *ZipLibrary = [paths objectAtIndex:0]; NSString *fullPathToFile = [ZipLibrary stringByAppendingPathComponent:@"backUp.zip"]; //[self.fileManager createDirectoryAtPath:fullPathToFile attributes:nil]; //self.documentsDir = [paths objectAtIndex:0]; ZipFile *zipFile = [[ZipFile alloc]initWithFileName:fullPathToFile mode:ZipFileModeCreate]; NSError *error = nil; self.fileManager = [NSFileManager defaultManager]; NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); self.documentsDir = [paths1 objectAtIndex:0]; NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:self.documentsDir error:&error]; //for(NSString *filename in files){ for(int i = 0;i<files.count;i++){ id myArrayElement = [files objectAtIndex:i]; if([myArrayElement rangeOfString:@".png" ].location !=NSNotFound){ NSLog(@"add %@", myArrayElement); NSString *path = [self.documentsDir stringByAppendingPathComponent:myArrayElement]; NSDictionary *attributes = [[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error]; NSDate *Date = [attributes objectForKey:NSFileCreationDate]; ZipWriteStream *streem = [zipFile writeFileInZipWithName:myArrayElement fileDate:Date compressionLevel:ZipCompressionLevelBest]; NSData *data = [NSData dataWithContentsOfFile:path]; // NSLog(@"%d",data); [streem writeData:data]; [streem finishedWriting]; }else if([myArrayElement rangeOfString:@".txt" ].location !=NSNotFound) { NSString *path = [self.documentsDir stringByAppendingPathComponent:myArrayElement]; NSDictionary *attributes = [[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error]; NSDate *Date = [attributes objectForKey:NSFileCreationDate]; ZipWriteStream *streem = [zipFile writeFileInZipWithName:myArrayElement fileDate:Date compressionLevel:ZipCompressionLevelBest]; NSData *data = [NSData dataWithContentsOfFile:path]; // NSLog(@"%d",data); [streem writeData:data]; [streem finishedWriting]; } } [self testcsv]; [zipFile close]; } 

你的文件目录保存项目.png和.txt文件压缩在库文件夹与backup.zip我希望这是帮助

不确定是否有内置函数,但也许可以使用InfoZip等外部库。 或者,你也可以尝试实现你自己的zip库,我很确定Zip格式规范可以在互联网上find。

RWendi