Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: ZIP pour windows

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut ZIP pour windows

    Bonjour

    J'ai le code précédent qui marche sous Linux, mais pas sous windows.
    Le problème, c'est que sous windows, il compile, s'exécute et ne fait RIEN ! Le fichier dont le chemin est ch est inchangé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            f_zip=zip_open(ch,ZIP_CREATE,NULL);
            n_zip=zip_source_filep(f_zip,fichier,0,0); /* récupération du fichier sous forme FILE * sans avoir à le copier sur le disque */
            zip_replace(f_zip,zip_name_locate(f_zip,"content.xml",ZIP_FL_NOCASE) ,n_zip); /* on l'injecte dans l'archive en lui donnant un nom */
            if (zip_close(f_zip)!=0)   /* on ferme l'archive */
            {
                printf("Erreur lors de la fermeture du fichier %s : %s\n",ch,zip_strerror(f_zip));
            }
            else
            { /* l'enregistrement c'est bien fait */
            }
    Ceci m'envoie dans le " printf("Erreur lors de la fermeture du fichier %s : %s\n",ch,zip_strerror(f_zip));". L'erruer est "Renaming temporary file lailed: File existe".
    Si je mets un point d'arrêt avant la sauvegarde et que je passe par le navigateur de fichier, je ne peux supprimer le fichier qui est déjà là : la version avant modification.

    Je ne suis pas le premier à avoir ce problème : http://www.nih.at/listarchive/libzip.../msg00602.html

    nb : Je modifie petit à petit...
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre expérimenté
    Avatar de charlespf
    Homme Profil pro
    Développeur C/C++/Qt/Python et WebPHP
    Inscrit en
    mai 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur C/C++/Qt/Python et WebPHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 251
    Points : 1 682
    Points
    1 682

    Par défaut

    Bonjour,

    Il faut que tu testes les retours des appels aux fonctions zip_* pour savoir d'où vient cette erreur (voir la doc de la lib pour les retours des différentes fonctions).
    Pour info également, les appels aux fonctions zip_add et zip_replace sont dépréciés et doivent être remplacés par respectivement zip_file_add et zip_file_replace.

    A+
    charlespf

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    Il va falloir que je change le code que j'avais donné pour l'utilisation de libzip à dvp.com

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
            f_zip=zip_open(ch,ZIP_CREATE,NULL);
            if (f_zip==NULL)
            {
                printf("Erreur lors de l'ouverture de %s : %s\n",ch,zip_strerror(f_zip));
            }
            else
            { /* l'ouverture de xml bien passée */
            }
            n_zip=zip_source_filep(f_zip,fichier,0,0); /* récupération du fichier sous forme FILE * sans avoir à le copier sur le disque */
            if (n_zip==NULL)
            {
                printf("Erreur lors de l'ouverture de content.xml : %s\n",zip_strerror(f_zip));
            }
            else
            { /* l'ouverture de xml bien passée */
            }
            if (zip_file_replace(f_zip,zip_name_locate(f_zip,"content.xml",ZIP_FL_NOCASE) ,n_zip,ZIP_FL_OVERWRITE)!=0) /* on l'injecte dans l'archive en lui donnant un nom */
            {
                printf("Erreur lors de l'insertion de content.xml dans %s : %s\n",ch,zip_strerror(f_zip));
            }
            else
            { /* l'insertion c'est bien faite */
            }
            if (zip_close(f_zip)!=0)   /* on ferme l'archive */
            {
                printf("Erreur lors de la fermeture du fichier %s : %s\n",ch,zip_strerror(f_zip));
            }
            else
            { /* l'enregistrement c'est bien fait */
            }
    Même problème et toujours la même erreur est retournée. Les garde-fou ne changent rien.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre expérimenté
    Avatar de charlespf
    Homme Profil pro
    Développeur C/C++/Qt/Python et WebPHP
    Inscrit en
    mai 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur C/C++/Qt/Python et WebPHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 251
    Points : 1 682
    Points
    1 682

    Par défaut

    La librairie libzip manipule les fichiers zip dans le répertoire temporaire de la machine (copie du fichier d'origine à l'appel de zip_open, et remplacement du fichier à la fermeture).

    Sous Windows, la fonction zip_close appelle la fonction MoveFileExA pour effectuer le remplacement du fichier (Voir ici et doc fonction MoveFileExA).

    La fonction va essayer de remplacer le fichier existant si le fichier cible existe déjà. Mais visiblement dans ton cas l'appel à cette fonction échoue. L'utilisateur Windows est-il autorisé à écrire le fichier et dans le répertoire ?

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    Normalement, j'ai les droits dessus. Mais, le problème (et je l'ai dans un autre cas), c'est qu'une fois que le fichier a été ouvert, je ne peux plus l'effacer tant que le programme tourne.

    Voici l'autre problème zip. J'ouvre un fichier pour lire/récupérer une partie et je le ferme après (mais, je n'ai pas regardé si la fermeture est sans erreur : à tester, mais pas ce soir). Tant que mon exécutable n'est pas fini, je ne peux pas le supprimer La récupération des données se passe très bien.
    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    #include "include.h"
    #include <string.h>
    #include <zip.h>
    #include <errno.h>
     
     
    #define ZIPZAP_SUCCESS 1
     
    char * content_libo(char * fichierZip,size_t * longueur)
    {
     
        /* Code d'origine : */
        /* http://forum.ubuntu-fr.org/viewtopic.php?pid=2596893#p2596893 Visité le 02/01/2011 */
        /* modifié pour ajouter la gestion des erreurs et quelques fonctionnalités */
     
        int err = 0, err_no=0;
        struct zip *f_zip=NULL;
        struct zip_stat file_stat;
        struct zip_file *file_zip=NULL;
        int id=-1;
        int i = 0;
        char buf_erreur[256];
        char * retour=NULL;
     
        if(fichierZip == NULL)
        {
            retour=NULL;
        }
        else
        {
            f_zip = zip_open(fichierZip, ZIP_CHECKCONS, &err); /* on ouvre l'archive zip */
     
            /* s'il y a des erreurs */
            if(err != ZIP_ER_OK)
            {
                zip_error_to_str(buf_erreur, sizeof buf_erreur, err, err_no);
                printf("Error %d : %s\n",err, buf_erreur);
                retour=NULL;
            }
            else if(f_zip==NULL)
            { /* si le fichier zip n'est pas ouvert */
                printf("Erreur à l'ouverture du fichier %s\n", fichierZip);
                retour= NULL;
            }
            else
            {
                /* on récupère le nombre de fichier dans l'archive zip */
                int count = zip_get_num_files(f_zip);
                if(count==-1)
                {
                    printf("Erreur à la lecture du fichier %s\n", fichierZip);
                    zip_close(f_zip);
                    f_zip = NULL;
                    retour = NULL;
                }
                else
                {
                    id=-1;
                    for(i=0; i<count; i++)
                    {
                        /* on utilise la position "i" pour récupérer le nom des fichiers */
                        if (strcmp("content.xml",zip_get_name(f_zip, i, ZIP_FL_UNCHANGED))==0) id=i;
                    }
                    if(id==-1)
                    {
     
                        printf("pas de content.xml dans le fichier %s\n", fichierZip);
                        zip_close(f_zip);
                        f_zip = NULL;
                        retour = NULL;
                    }
                    else
                    {
                        zip_stat_index(f_zip, id, 0, &file_stat);
     
                        /* 4. pour connaître la taille du fichier et ainsi pouvoir le lire en entier*/
                        if(zip_stat(f_zip, file_stat.name, 0, &file_stat) == -1)
                        {
                            printf("%s\n", zip_strerror(f_zip));
                            retour = NULL;
                        }
                        else
                        {
                            /* 5. on ouvre le fichier archivé */
                            file_zip=zip_fopen(f_zip, file_stat.name, ZIP_FL_UNCHANGED);
                            if(!file_zip)
                            {
                                printf("%s\n", zip_strerror(f_zip));
                                retour = NULL;
                            }
                            else
                            {
                                char *str=NULL;
                                str = g_malloc((size_t)(file_stat.size+1));
                                *longueur=file_stat.size;
                                memset(str, 0, (size_t)(file_stat.size+1));
                                if(str == NULL)
                                {
                                    printf("Erreur d'allocation mémoire\n");
                                    retour = NULL;
                                    zip_close(f_zip);
                                }
                                else if(zip_fread(file_zip, str, (size_t)(file_stat.size)) != (int)file_stat.size)
                                { /* 6. on lit le fichier archivé */
                                    printf("%s\n", zip_strerror(f_zip));
                                    free(str);
     
                                    zip_fclose(file_zip);
                                    file_zip = NULL;
                                    retour = NULL;
                                }
                                else
                                {
                                    zip_close(f_zip);
                                    file_zip = NULL;
                                    retour = str;
                                }
                            }
                        }
                    }
                }
            }
        }
     
        return retour;
    }
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Membre expérimenté
    Avatar de charlespf
    Homme Profil pro
    Développeur C/C++/Qt/Python et WebPHP
    Inscrit en
    mai 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur C/C++/Qt/Python et WebPHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 251
    Points : 1 682
    Points
    1 682

    Par défaut

    Mmmh cela me semble normal, vu que Windows considère que le fichier est ouvert par un programme, que le fichier zip en question ne peut être supprimé.

    Je voulais également savoir où tu avais récupéré la bibliothèque libzip compilée pour windows ?

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    Je dois avoir la 0.9 livré avec mageia (mingw_libzip je crois).
    J'ai remonté un bug signalant que la 1.0.1 répare des bug windows. Dès que j'ai le temps (quand ?), je récupère les fichiers de la 1.0.1 pour tester.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Membre expérimenté
    Avatar de charlespf
    Homme Profil pro
    Développeur C/C++/Qt/Python et WebPHP
    Inscrit en
    mai 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur C/C++/Qt/Python et WebPHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 251
    Points : 1 682
    Points
    1 682

    Par défaut

    Oui, je pense qu'il est préférable d'utiliser une version plus récente. Je viens d'ailleurs de voir que Fedora avait rebuildé la libzip avec mingw32 (avec la v1.0.1) en novembre dernier à cause d'un changement dans l'API Windows. Cela fonctionnera peut-être mieux après un rebuild de la bibliothèque et de ton programme.

    A+

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    J'ai vu et téléchargé. Dès que je peux je regarde.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    Je viens de tester.
    La mauvaise nouvelle, c'est que je ne vois pas de différences

    Je me demandais, et ça simplifierait bien mon travail : est-il possible de sauver l'archive sous un autre nom que celui qu'elle avait lors de l'ouverture ?
    En effet, j'ouvre un modèle de document LibreOffice dans lequel j'insère le content.xml . Je fichier final n'étant pas le modèle, il a bien sûr un autre nom. Et comme ça, le problème disparaît (sans être résolu).
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    novembre 2003
    Messages
    5 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 5 467
    Points : 7 676
    Points
    7 676

    Par défaut

    Oups...

    J'avais oublié de mettre le dll au bon endroit : avec le dll avec l'exécutable, c'est bon
    Donc, c'est juste un bug de l'ancienne version de libzip.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  12. #12
    Membre expérimenté
    Avatar de charlespf
    Homme Profil pro
    Développeur C/C++/Qt/Python et WebPHP
    Inscrit en
    mai 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur C/C++/Qt/Python et WebPHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 251
    Points : 1 682
    Points
    1 682

    Par défaut

    Bonne nouvelle .

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Stratégie d'installation des fixes pour windows 2000/2003
    Par bill4134 dans le forum Autres Logiciels
    Réponses: 20
    Dernier message: 07/07/2004, 16h04
  2. les cahiers du programmeur "l'installeur pour Windows&
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 26/05/2004, 10h56
  3. [Blob] PostGreSQL Beta4 pour Windows
    Par YanK dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/10/2003, 11h46
  4. Créer de programme pour WIndows avec Turbo Pascal
    Par kaygee dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 20/08/2003, 23h22
  5. Format d'un exe pour DOS et pour Windows
    Par Alfhiger dans le forum Assembleur
    Réponses: 4
    Dernier message: 12/06/2002, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo