10
votes

Bibliothèque d'encodage / décodage TAR pour iPhone (idéalement cacao)

Est-ce que quelqu'un connaît toute bibliothèque / code qui me permettra d'encoder et de décoder des données formatées .TAR - que je peux utiliser dans mon projet iPhone (de préférence cacao)

Merci d'avance

craig

MISE À JOUR: J'ai examiné les bibliothèques suggérées et parvenue à la conclusion qu'ils font de Waaaay à une grande partie du problème - je développe moi-même le codec - c'est seulement une en-tête ASCII de 512Bytes après tout - comment dur peut-il être: -)


2 commentaires

Premier élément trouvé dans Google 'Tar Bibliothèque C' Feep.net/Libtar


Craig, avez-vous déjà trouvé une bonne réponse ici ... ou fait des progrès sur votre propre mise en œuvre? C'est un grand trou dans l'espace API, autant que je sache. Aussi: J'ai réussi à obtenir que Libtar compilait dans des bibliothèques statiques respectueuses de l'iPhone, mais c'était un processus douloureux et j'ai rencontré quelques accidents dans des cas de test qui me font fondamentalement penser que je dois abandonner la direction entière.


7 Réponses :


1
votes

Vous pouvez essayer libxad . Ceci est la bibliothèque qui Le nonchiver , une application Mac, utilise.


0 commentaires

3
votes

En fait, LibRarchive.DYLIB est inclus dans l'iPhone SDK. Vous devez juste l'ajouter. Le problème est que Apple n'a pas inclus l'archive du fichier d'en-tête.h. Cependant, d'abord, vous n'avez pas besoin des fichiers d'en-tête si vous savez avec certitude les fonctions que vous allez appeler existent (bien que le compilateur se gémit), seconde, si vous ne souhaitez pas que le compilateur se plaint, vous pouvez télécharger le fichier d'en-tête. Pour Librarchive 2.6 et l'inclure dans votre programme ...

Si vous voulez savoir savoir pour utiliser LibRarchive, téléchargez sa source du Web et étudiez l'exemple donné (en particulier Minitar). C'est vraiment très simple.


3 commentaires

Je crois que cela fait de manière non documentée, ce qui signifie que vous ne pouvez pas l'utiliser. Mais je pourrais avoir tort.


S'il vous plaît voir ma réponse ci-dessous. LibarArchive est une API privée sur toutes les versions de iOS. Pour être une API publique (1) la bibliothèque binaire doit être dans le SDK, et (2) le fichier d'en-tête doit être dans le SDK.


Est-ce que LibarRarchive est-il public sur Mac OS?



1
votes

Même meilleur lien: http://code.google.com/p/libarchive/downloads/detail?Name=libarchive-2.6.2.tar.gz&can=2&q=

La version 2.6.2 est incluse dans les SDK iOS 4.0 et 4.1. Ce n'est pas présent en 3.2 (ou plus tôt je suppose).

Si vous téléchargez cela, exécutez ./ configure --prefix = $ home && make && créer installer et vous trouverez les deux fichiers d'en-tête placés en $ home / include


1 commentaires

S'il vous plaît voir ma réponse ci-dessous. LibarArchive est une API privée sur toutes les versions de iOS. Pour être une API publique (1) la bibliothèque binaire doit être dans le SDK, et (2) le fichier d'en-tête doit être dans le SDK.



5
votes

La meilleure bibliothèque que j'ai trouvée est libarchive . Il est bien conçu, bien documenté et rapide.

Je viens de créer un référentiel sur GitHub qui dispose des outils pour créer LibRarchive et libbz2 comme des bibliothèques statiques pour iOS 4.2+. (Il devrait être possible de l'utiliser pour cibler la version 3.x.)

http://github.com/davepeck/ios-libarchive/

D'autres ont souligné que libarchive est inclus dans le SDK. Ce n'est pas tout à fait vrai. Le binaire libarchive.2.dylib est inclus, mais les en-têtes ne sont pas. La même chose s'applique à libbz2 (mais, curieusement, pas à libz .) Cela signifie que libarchive est considéré comme une API privée - en d'autres termes Vous ne pouvez pas l'utiliser si vous avez l'intention d'expédier sur l'App Store. D'où mon référentiel.


3 commentaires

Hey Dave, merci de partager votre travail. Je me demande si vous avez réellement soumis une application au magasin à l'aide de ce code. Cette question suggère que vous pouvez toujours avoir des problèmes: Stackoverflow .com / questions / 3507684 / ...


Projet lié à a été effacé de l'existence


LibarArchive est un logiciel libre, comment Apple pourrait "privé"?



0
votes

LibarRarchive vient préinstallé sur iOS.


0 commentaires

1
votes

Pour LibRarchive, cela fonctionne hors de la boîte en ajoutant simplement "LibRarchive" à votre liste de formats, mais l'en-tête est manquant. Vous pouvez copier les en-têtes de la source de Libarchive. Ou si vous voulez garder cela simple, essayez ceci:

+ (void)unpackArchive: (NSData*) archiveData
{
    int r;
    struct archive* a;
    struct archive_entry *entry;
    const char *entry_path;
    NSString *baseDir = [self baseDir];
    NSFileHandle* file;
    NSError* error;
    NSDictionary* result = @{};

    NSLog(@"Unpacking %d byte static assets tarball into %@", [archiveData length], baseDir);

    if (![[NSFileManager defaultManager] createDirectoryAtPath:baseDir
                                   withIntermediateDirectories:YES
                                                    attributes:nil
                                                         error:&error])
    {
        NSLog(@"Create directory error: %@", error);
    }

    a = archive_read_new();
    archive_read_support_format_gnutar(a);
    archive_read_support_format_tar(a);
    archive_read_support_compression_gzip(a);

    r = archive_read_open_memory(a, (void*)[archiveData bytes], [archiveData length]);
    if (r != ARCHIVE_OK) {
        NSLog(@"ERROR[%d] in archive_read_open_file(): %s", r, archive_error_string(a));
        return;
    }
    for (;;) {
        r = archive_read_next_header(a, &entry);
        if (r == ARCHIVE_EOF) {
            break;
        }
        if (r != ARCHIVE_OK) {
            NSLog(@"ERROR[%d] in archive_read_next_header(): %s", r, archive_error_string(a));
            return;
        }
        entry_path = archive_entry_pathname(entry);

        NSString* path = [baseDir stringByAppendingPathComponent: [NSString stringWithUTF8String: entry_path]];
        NSLog(@"Tarball Entry: %s", entry_path);

        // Create the file and blank it out
        [[NSFileManager defaultManager] createFileAtPath: path contents:[[NSMutableData alloc] init] attributes:nil];
        // Actually write the file
        file = [NSFileHandle fileHandleForWritingAtPath:path];
        r = archive_read_data_into_fd(a, [file fileDescriptor]);
        if (r != ARCHIVE_OK) {
            NSLog(@"ERROR[%d] in archive_read_data_into_fd(): %s", r, archive_error_string(a));
            return;
        }
        [file closeFile];
    }
    r = archive_read_close(a);
    if (r != ARCHIVE_OK) {
        NSLog(@"ERROR[%d] in archive_read_close(): %s", r, archive_error_string(a));
        return;
    }
}


0 commentaires

0
votes

Il semble y avoir deux bibliothèques plus modernes, toutes deux disponibles sous forme de cocoapodes:

  • NVHTARGZIP : prend en charge les rapports d'avancement et a à la fois des méthodes synchronisées et asynchronisées. Ne supporte pas la rédaction du goudron.
  • Tarkit : prend en charge la rédaction du goudron, mais n'a pas les autres fonctionnalités intéressantes.

    Les deux sont très similaires, car ils sont tous deux basés sur Light-endnar-for -IOS .


3 commentaires

Tarkit produit des fichiers qui ne sont pas développés par Archive Utility.app, Yosemite, le fichier i Tar'ed est un fichier de polices.


Correction: [Docteur TarfileatPath: Filépath Topath: Tarr FilePath Erreur: NIL] suppose que FilePath est un dossier et donc s'il ne s'agit que d'un fichier à goudron, il échoue ...


J'ai fini par utiliser nvhtargzip, après Contribuer .tar et . tar.gz Emballage à celui-ci.