iPhone Rozpakuj kod

Naprawdę utknąłem przy próbie napisania kodu, aby rozpakować plik lub katalog na iPhonie.

Poniżej znajduje się przykładowy kod, którego używam do rozpakowania prostego pliku tekstowego.

Rozpakowuje plik, ale jest uszkodzony.

(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);  
}
Author: Cœur, 2009-01-05

8 answers

MA " sample.zip " naprawdę został stworzony z gZip? The .rozszerzenie zip jest zwykle używane w archiwach utworzonych przez WinZip. Można je również dekompresować za pomocą zLib, ale trzeba by przeanalizować nagłówek i użyć innych procedur.

Aby sprawdzić, spójrz na dwa pierwsze bajty pliku. Jeśli jest 'PK', to WinZip, jeśli jest 0x1F8B, to gZip.

Ponieważ jest to specyficzne dla iPhone ' a, spójrz na tę iPhone SDK forum dyskusyjne Gdzie miniZip jest wymieniony. Wydaje się to może obsługiwać pliki WinZip.

Ale jeśli to naprawdę plik WinZip, powinieneś spojrzeć na specyfikację WinZip i spróbować przeanalizować plik samodzielnie. Zasadniczo powinno to być parsowanie niektórych wartości nagłówka, szukanie pozycji skompresowanego strumienia i używanie funkcji zLib do jego dekompresji.

 13
Author: schnaader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 14:35:08

Chciałem łatwego rozwiązania, ale nie znalazłem takiego, które mi się tu podoba, więc zmodyfikowałem bibliotekę, aby robiła to, co chciałem. Możesz znaleźć SSZipArchive przydatne. (Może również tworzyć pliki zip przy okazji.)

Użycie:

NSString *path = @"path_to_your_zip_file";
NSString *destination = @"path_to_the_folder_where_you_want_it_unzipped";
[SSZipArchive unzipFileAtPath:path toDestination:destination];
 42
Author: Sam Soffes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 12:36:39

Ten kod zadziałał dobrze dla mnie na gzip:

Baza danych została przygotowana tak: gzip foo.db

Klucz zapętlał się nad gzread (). Powyższy przykład odczytuje tylko pierwsze fragmenty bajtów.

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

Nawiasem mówiąc, mogę rozpakować 33MB do 130MB w 77 sekund lub około 1,7 MB nieskompresowanej / sekundę.

 12
Author: Carl Coryell-Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 12:50:59

Ten kod rozpakuje każdy .plik zip do katalogu dokumentu aplikacji i pobierz plik z zasobów aplikacji.

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
Author: marshad13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 07:06:45

Naprawdę trudno rozpakować dowolny dowolny plik zip. Jest to złożony format pliku i potencjalnie istnieje wiele różnych procedur kompresji, które mogły być używane wewnętrznie do pliku. Info-ZIP ma do tego dowolny kod ( http://www.info-zip.org/UnZip.html), które mogą być wykonane do pracy na iPhonie z jakimś hackowaniem, ale API jest szczerze mówiąc okropne-polega na przekazywaniu argumentów wiersza poleceń do fałszywego "main", który symuluje uruchamianie rozpakowywania (szczerze mówiąc to dlatego, że ich kod nigdy nie został zaprojektowany do użycia w ten sposób w pierwszej kolejności, funkcjonalność biblioteki została przykręcona później).

Jeśli masz kontrolę nad tym, skąd pochodzą pliki, które próbujesz rozpakować, ja wysoce zalecam użycie innego systemu kompresji zamiast ZIP. Jego elastyczność i wszechobecność sprawiają, że świetnie nadaje się do przesyłania archiwów plików osobiście do osoby, ale automatyzacja jest bardzo niezręczna.

 1
Author: th_in_gs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 13:09:04

Zlib nie jest przeznaczony do otwierania .pliki zip, ale masz szczęście: katalog contrib zlib zawiera minizip, który może używać zlib do otwierania .pliki zip.

Może nie być dołączony do zestawu SDK, ale prawdopodobnie możesz użyć dołączonej wersji zlib use it. Pobierz kopię źródła zlib i poszukaj w contrib / minizip.

 1
Author: Jeff M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 13:16:55

Nie używałem iPhone ' a, ale może warto spojrzeć na GZIP , który jest bardzo przenośną biblioteką zip open source dostępną na wiele platform.

 0
Author: Shane MacLaughlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 12:45:40

Miałem trochę szczęścia testując to na symulatorze iPhone ' a:

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

To wygląda łatwiej niż majstrowanie przy zlib...

 -5
Author: James Boston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 00:41:03