2008-11-13 5 views
11

Je développe une application iOS, et en essayant de compresser le fichier que j'ai créé dans l'application, existe-t-il une fonction intégrée capable de faire cela?Comment puis-je créer un fichier zip en utilisant Objective C?

+0

Qu'est-ce que vous en avez besoin? Juste compresser et envoyer un fichier quelque part? Si c'est le cas, vous pouvez utiliser le zlib qui est déjà inclus. –

+0

S'il vous plaît vérifier votre réponse à [ici] [1] [1]: http://stackoverflow.com/questions/7386695/how-to-zip-file/18740716#18740716 – Nirmalsinh

Répondre

9

Comme le souligne Alex, je répondu à this question en soulignant le NSData category contribué par les utilisateurs du wiki CocoaDev. Cette catégorie inclut des méthodes pour gérer les données zippées et gzippées dans une instance NSData (qui peuvent être lues à partir d'un fichier Zip ou écrites dans une instance). Cela devrait être tout ce dont vous avez besoin pour implémenter le fichier zip que vous décrivez, tant que vous pouvez alimenter vos données de fichier dans une instance NSData.

Pour un exemple de cette catégorie en action, veuillez consulter le code source de mon application iPhone, Molecules. Je n'utilise la méthode pour extraire des données à partir d'un fichier gzip (dans SLSMolecule + PDB.m), mais vous devriez être en mesure d'obtenir les concepts de base à partir de cela.

+4

Le lien vers la catégorie NSData est rompu. –

+1

@GlennHowes - Il est disponible dans les archives web ici: http://web.archive.org/web/20100102154917/http://cocoadev.com/index.pl?NSDataCategory, mais j'ai édité ma question plus ancienne pour inclure l'intégralité de la catégorie pour le préserver ici. –

0

Vous ne savez pas s'il existe une fonction intégrée, mais vous pourriez peut-être utiliser une bibliothèque externe telle que InfoZip. Ou bien vous pouvez essayer d'implémenter votre propre bibliothèque zip, je suis assez sûr que la spécification de format Zip peut être trouvée quelque part sur Internet.

RWendi

+0

Je l'ai fait il. Pas de science de fusée, mais beaucoup d'ennui. –

2

d'abord vous téléchargez exemple Objective-zip de http://code.google.com/p/objective-zip/downloads/list

Dans cet exemple, Trouvez et copier trois dossiers Objective-Zip, faites glisser Minizip et ZLib à votre projet

classe import deux en vous .M classe "ZipFile.h" et "ZipWriteStream.h"

méthode de création de zip mon code est: -

-(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]; 

} 

vos documents élément enregistré répertoire .png et les fichiers txt dans le dossier Bibliothèque zipping avec backup.zip J'espère que cela est aide

+0

quoi de neuf auto testcsv ?? – chostDevil

12

Je recommande vraiment-Zip objectif. Il vient récemment déménagé à https://github.com/flyingdolphinstudio/Objective-Zip:

Quelques exemples de leurs documents:

Création d'un fichier Zip:

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

Ajout d'un fichier dans un fichier zip:

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

[stream writeData:abcData]; 
[stream finishedWriting]; 
Lecture d'un fichier à partir d'un fichier 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]; 
+0

Fonctionne bien dans Xcode 5.1 et iOS 7.1 –

+0

N'oubliez pas de fermer le fichier par [zipfile close]; –

Questions connexes