Frage

Wirklich stecken zu versuchen, Code zu schreiben, eine Datei oder ein Verzeichnis auf dem iPhone entpacken.

Im Folgenden finden Sie einig Beispielcode, ich bin mit einer einfachen Textdatei, um zu versuchen und entpacken.

Es packt die Datei aber seine beschädigt.

(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);  
}
War es hilfreich?

Lösung

Hat "sample.zip" wirklich mit gzip erstellt? Die .zip-Erweiterung ist in der Regel für die Archive von WinZip verwendet. Diese können auch mit zLib dekomprimiert werden, aber man müßte den Header analysieren und andere Routinen verwenden.

Um zu überprüfen, haben einen Blick auf den ersten beiden Bytes der Datei. Wenn es PK ', es ist WinZip, wenn es 0x1F8B ist, ist es gzip.

Da dies iPhone spezifisch, haben einen Blick auf diese iPhone SDK Forum Diskussion wo miniZip erwähnt . Es scheint, diese WinZip-Dateien verarbeiten kann.

Aber wenn es wirklich eine WinZip-Datei, sollten Sie einen Blick auf die WinZip Spezifikation haben und versucht, die Datei selbst zu analysieren. Es sollte grundsätzlich einige Header-Werte werden Parsen, die komprimierten Strom Position suchen und mit zLib Routinen zu dekomprimieren.

Andere Tipps

wollte ich eine einfache Lösung und nicht eine fand ich hier gefallen hat, so verändert ich eine Bibliothek zu tun, was ich wollte. Sie können feststellen, SSZipArchive nützlich. (Es kann auch ZIP-Dateien durch die Art und Weise erstellen.)

Verbrauch:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];

Dieser Code funktioniert gut für mich für gzip:

Die Datenbank wurde wie folgt hergestellt:     gzip foo.db

der Schlüssel wurde über die gzread Looping (). Das obige Beispiel nur liest die erste CHUNK Bytes.

#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");

Übrigens kann in I 33MB 130MB in 77 Sekunden oder etwa 1,7 MB unkomprimierten / Sekunde dekomprimieren.

Dieser Code wird jede ZIP-Datei in Ihr App Dokumentenverzeichnis entpacken und Datei von App-Ressourcen erhalten.

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

Es ist wirklich schwer, jede beliebige Zip-Datei zu entpacken. Es ist ein komplexes Dateiformat, und es gibt möglicherweise viele verschiedene Komprimierungsroutinen, die verwendet wurden, um die Datei intern könnten. Info-ZIP etwas frei licencable Code hat, es zu tun ( http: // www .info-zip.org / UnZip.html ), die mit einem gewissen Hacking auf das iPhone arbeiten gemacht werden kann, aber die API ist ehrlich gesagt schrecklich - es Befehlszeilenargumente auf einen gefälschten ‚main‘ beinhaltet vorbei, die simuliert die Durchführung von UnZIP (um fair zu sein, das ist, weil ihr Code nie so in erster Linie verwendet wird, wurde entwickelt, wurde die Bibliothek Funktionalität danach verschraubt).

Wenn Sie die Kontrolle über haben, wo die Dateien Sie versuchen, aus zu entpacken kommen, I sehr empfehlen statt ZIP ein anderes Kompressionssystem. Es ist Flexibilität und Allgegenwart für die Weitergabe von Dateiarchiven um in Person-to-Person, die es groß zu machen, aber es ist sehr schwierig zu automatisieren.

zlib ist nicht öffnen ZIP-Dateien gemeint, aber Sie haben Glück. Zlib contrib Verzeichnis enthält minizip, die in der Lage ist zlib zu verwenden, um Dateien zu öffnen .zip

Es kann nicht im SDK gebündelt werden, aber Sie können wahrscheinlich die gebündelte Version von zlib verwenden Sie es verwenden. Schnappen Sie sich eine Kopie der zlib Quelle und schauen in contrib / minizip.

Ich habe nicht das iPhone verwendet, aber Sie können unter GZIP suchen möchten, die a sehr tragbar für viele Plattformen verfügbar zip-Bibliothek Open Source.

Ich hatte etwas Glück auf dem iPhone Simulator testet diese:

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

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *saveLocation = 
   [documentsDirectory stringByAppendingString:@"myfile.zip"];

NSFileManager* fileManager = [NSFileManager defaultManager];

if ([fileManager fileExistsAtPath:saveLocation]) {
    [fileManager removeItemAtPath:saveLocation error:nil];

}

NSURLRequest *theRequest = 
             [NSURLRequest requestWithURL:
                [NSURL URLWithString:@"http://example.com/myfile.zip"]
             cachePolicy:NSURLRequestUseProtocolCachePolicy
             timeoutInterval:60.0];    

NSData *received = 
             [NSURLConnection sendSynchronousRequest:theRequest 
                              returningResponse:nil error:nil];    

if ([received writeToFile:saveLocation atomically:TRUE]) {      
    NSString *cmd = 
       [NSString stringWithFormat:@"unzip \"%@\" -d\"%@\"", 
       saveLocation, documentsDirectory];       

    // Here comes the magic...
    system([cmd UTF8String]);       
}

Es sieht einfacher als Hantieren mit zlib ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top