Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/04/2009, à 08:55

kevlar

[résolu]Comment utiliser libzip ?

Bonjour à tous ! smile
Voici ma question du jour : dans le cadre de mon projet en cours, j'ai besoin de compresser/décompresser un ensemble de fichiers dans un répertoire donné. Je programme en C. Je pourrais donc faire un appel à la fonction system dans ce style :

retour = system("tar ...");

ou encore

retour = system ("zip ...");

Mais la méthode ne me semble plus très professionnelle, ni, très sûre. Aussi, je souhaite accéder via le C à une API. J'aurais préféré utiliser tar (grâce à son côté libre et Unix), mais je n'ai pas trouvé comment (ni trop cherché ). Par contre, j'ai trouvé de la doc sur libzip. Cette bibliothèque a l'air sympa, mais elle ne semble pas faire "simplement" ce que je demande :
1- donner un liste de fichiers, puis les zipper.
2- donner un fichier zippé, et décompresser les fichiers.

J'aurais besoin de vos lumières (pas forcément avec Zip) : je cherche une source libre, en C, pour faire ce travail wink
Si quelqu'un a déjà les algos parmi vous, ce serait sympa !

Dernière modification par kevlar (Le 27/04/2009, à 18:56)

Hors ligne

#2 Le 27/04/2009, à 09:06

kevlar

Re : [résolu]Comment utiliser libzip ?

par exemple, on trouve ici un très bon exemple :
http://www.siteduzero.com/forum-83-3723 … unzip.html

mais je ne vois pas comment, sans lire les fichiers inclus, simplement les extraire ? tongue

Sauf à lire en binaire (fget) le contenu de l'archive, ouvrir un fichier binaire en écriture, et faire un dump binaire ? Correct ? yikes

Dernière modification par kevlar (Le 27/04/2009, à 09:14)

Hors ligne

#3 Le 27/04/2009, à 09:24

rniamo

Re : [résolu]Comment utiliser libzip ?

http://nih.at/libzip/libzip.html ... read file non ?


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#4 Le 27/04/2009, à 10:23

kevlar

Re : [résolu]Comment utiliser libzip ?

Oui ; mais les auteurs ne décrivent même pas la struct "zip" ; je viens de parcourir le fichier zip.h de mon disque dur, rien non plus ... encore du temps perdu, alors que l'info doit bien être quelque part (rien non plus dans man libzip, toujours les mêmes descriptions recopiées partout sur le net...):(

Rectification : la description des structures "utiles" est dans zipint.h

Dernière modification par kevlar (Le 27/04/2009, à 10:31)

Hors ligne

#5 Le 27/04/2009, à 17:35

kevlar

Re : [résolu]Comment utiliser libzip ?

Bon, voilà ce que ça donne : la fonction ci-dessous (faite à partir de l'exemple cité au message #2) prend en argument un chemin complet jusqu'à une archive .ZIP, et l'extrait dans le dossier COURANT (pas eu le temps de faire en sorte d'extraire dans le MÊME dossier que l'archive, si quelqu'un pouvait me donner un coup de main ...)

int open_archive(char *path)
{
    char buf[256];
    int err=0,i,s,score;
    int nto;
    struct zip *archive;
    struct zip_file *fpz=NULL;
    struct zip_stat sb;
    char *p,*p2,car;
     FILE *fichier;

    /* accès au fichier ZIP */
    archive=zip_open(path,ZIP_CHECKCONS,&err);
    if(err != 0 || !archive)
    {
        zip_error_to_str(buf, sizeof buf, err, errno);
        fprintf(stderr,"«%s» %d in function «%s» ,err=%d\n«%s»\n",__FILE__,__LINE__,__FUNCTION__,err,buf);
        exit(EXIT_FAILURE);
    }    
    /* déterminer le nombre de fichiers contenus */
    nto = zip_get_num_files(archive);
    printf("nombre total de fichiers %d \n",nto);
    printf("voici les fichiers : \n");
    for (i=0;i<nto;i++)
      {
       zip_stat_index(archive, i, 0, &sb);
       printf("%s\n",sb.name);
       /*pour savoir la taille du fichier et ainsi pouvoir le lire en entier*/
       if(zip_stat(archive, sb.name, 0, &sb) == -1)
        {
          strcpy(buf,zip_strerror(archive));
          fprintf(stderr,"«%s» %d in function «%s»\n«%s»\n",__FILE__,__LINE__,__FUNCTION__,buf);
          zip_fclose(fpz);
          zip_close(archive);
          exit(EXIT_FAILURE);
        }
       printf("taille du fichier %d \n",sb.size*sizeof(char)+1);
      fpz=zip_fopen(archive,sb.name,ZIP_FL_UNCHANGED);
      if(!fpz)
       {
        strcpy(buf,zip_strerror(archive));
        fprintf(stderr,"«%s» %d in function «%s»\n«%s»\n",__FILE__,__LINE__,__FUNCTION__,buf);
        zip_close(archive);
        exit(EXIT_FAILURE);
       }
       p=malloc(sb.size*sizeof(char)+1);
       assert(p != NULL);
       /*lit le fichier*/
       if(zip_fread(fpz,p,sb.size) != sb.size)
        {
          fprintf(stderr,"«%s» %d in function «%s»\n«read error ...»\n",__FILE__,__LINE__,__FUNCTION__);
          free(p);
          zip_fclose(fpz);
          zip_close(archive);
          exit(EXIT_FAILURE);
        }
        /* écriture en mode binaire */
        fichier = fopen(sb.name,"w");
        fwrite(p,sizeof(char),sb.size,fichier);
        fclose(fichier);
        zip_fclose(fpz);
       free(p);
      }   
   /* lecture terminée, fermeture de l'archive */
    zip_close(archive);    

 return 0;
}

Hors ligne

#6 Le 27/04/2009, à 18:56

kevlar

Re : [résolu]Comment utiliser libzip ?

résolu ... j'arrive maintenant à créer des archives avec libzip smile

Hors ligne