web-dev-qa-db-fra.com

Code iPhone Unzip

Vraiment coincé à essayer d'écrire du code pour décompresser un fichier ou un répertoire sur l'iPhone.

Vous trouverez ci-dessous un exemple de code que j'utilise pour essayer de décompresser un fichier texte simple.

Il décompresse le fichier mais sa corrompue.

(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);  
}
26
TonyNeallon

"SAMPLE.ZIP" a-t-il vraiment été créé avec GZIP? L'extension .zip est généralement utilisée pour les archives créées par Winzip. Ceux-ci peuvent également être décompressés à l'aide de ZLIB, mais vous devez analyser l'en-tête et utiliser d'autres routines.

Pour vérifier, consultez les deux premiers octets du fichier. Si c'est "pk", c'est Winzip, s'il s'agit de 0x1F8B, c'est Gzip.

Parce que c'est spécifique à l'iPhone, examinez ceci Discussion du forum SDK iPhone SDKMinizip est mentionné. Il semble que cela puisse gérer des fichiers Winzip.

Mais si c'est vraiment un fichier WinZip, vous devriez consulter le Spécification WinZip et essayer d'analyser vous-même le fichier vous-même. Il devrait essentiellement d'analyser certaines valeurs d'en-tête, à la recherche de la position du flux compressé et d'utiliser des routines de ZLIB pour le décompresser.

13
schnaader

Je voulais une solution facile et je n'ai trouvé que celui que j'ai aimé ici, j'ai donc modifié une bibliothèque pour faire ce que je voulais. Vous pouvez trouver ssziparchive utile. (Cela peut également créer des fichiers zip à la manière.)

Usage:

NSString *path = @"path_to_your_Zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];
42
Sam Soffes

Ce code a bien fonctionné pour moi pour GZIP:

la base de données a été préparée comme ceci: gzip foo.db

la clé était en boucle sur la GZREAD (). L'exemple ci-dessus ne lit que les premiers octets de morceau.

#import <zlib.h>
#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");

Incidemment, je peux décompresser 33 Mo en 130 Mo en 77 secondes ou environ 1,7 Mo non compressé/seconde.

12
Carl Coryell-Martin

Ce code va décompresser n'importe quel fichier .zip dans votre répertoire de documents d'application et obtenir le fichier des ressources de l'application.

self.fileManager = [NSFileManager defaultManager];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSLog(@"document directory path:%@",paths);

self.documentDirectory = [paths objectAtIndex:0];

NSString *filePath = [NSString stringWithFormat:@"%@/abc", self.documentDirectory];

NSLog(@"file path is:%@",filePath);

NSString *fileContent = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data.Zip"];


NSData *unzipData = [NSData dataWithContentsOfFile:fileContent];

[self.fileManager createFileAtPath:filePath contents:unzipData attributes:nil];

// here we go, unzipping code

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

if ([zipArchive UnzipOpenFile:filePath])
{
    if ([zipArchive UnzipFileTo:self.documentDirectory overWrite:NO])
    {
        NSLog(@"Archive unzip success");
        [self.fileManager removeItemAtPath:filePath error:NULL];
    }
    else
    {
        NSLog(@"Failure to unzip archive");
    }
}
else
{
    NSLog(@"Failure to open archive");
}
[zipArchive release];
4
marshad13

Il est vraiment difficile de décompresser aucun fichier zip arbitraire. C'est un format de fichier complexe et il existe potentiellement de nombreuses routines de compression différentes qui auraient pu être utilisées à l'intérieur du fichier. Info-zip a un code librement licenciable pour le faire ( http://www.info-zip.org/unzip.html ) qui peut être fait pour fonctionner sur l'iPhone avec un piratage, mais le API est franchement horrible - cela implique de passer des arguments de ligne de commande à une fausse "principale" qui simule le fonctionnement d'UNZIP (pour être juste, c'est que leur code n'a jamais été conçu pour être utilisé comme celui-ci. La fonctionnalité de la bibliothèque a été boulonnée. sur la suite).

Si vous avez le contrôle de l'endroit où les fichiers que vous essayez de décompresser sont à partir de, i hautement Recommandez à l'aide d'un autre système de compression au lieu de zip. C'est la flexibilité et l'ubiquité le rendent idéal pour passer des archives de fichiers en personne à personne, mais il est très difficile d'automatiser.

1
th_in_gs

zLIB n'est pas censé ouvrir des fichiers .zip, mais vous avez de la chance: le répertoire des contributions de ZLIB inclut Minizip, capable d'utiliser ZLIB pour ouvrir des fichiers .zip.

Il ne peut pas être groupé dans le SDK, mais vous pouvez probablement utiliser la version fournie de ZLIB l'utiliser. Prenez une copie de la source de ZLIB et regardez dans Contrib/Minizip.

1
Jeff M

Je n'ai pas utilisé l'iPhone, mais vous voudrez peut-être regarder [~ # ~] gzip [~ # ~ ~] , qui est une bibliothèque de zip-zip open source portable disponible pour de nombreuses plateformes.

0
SmacL