IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C Discussion :

Raison pour echec d'un remove


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut Raison pour echec d'un remove
    Bonjour,
    Je travaille sur un projet qui tourne sous VMS, unix, NT.
    Sous Unix, il semble qu'un fichier ne soit pas supprimé, j'aimerai en connaitre la raison.
    Voici le code de la fonction de suppression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int  f_supprimer_fichier(char * const nom_fichier_a_supprimer )
    {
    int retour;
    #ifndef V_UNIX
        char nom_fichier[1024];
        strcpy(nom_fichier,nom_fichier_a_supprimer);
        strcat(nom_fichier,";*");
        retour=remove(nom_fichier);
    #else
        retour=remove(nom_fichier_a_supprimer);
    #endif
    return retour;
    }
    En principe dans le cas posant problème on a V_UNIX positionné.
    Pour information sous VMS les fichiers sont versionné, et ont un nom du type Nom_fichier;version. Quand on fait un delete nom_fichier;* on supprime toutes les versions du fichier, d'où la concaténation.

    La question principale est peut-on savoir pourquoi le remove n'a pas renvoyé 0, de préférence quelque soit la plateforme.
    Merci
    Soazig

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par soazig
    La question principale est peut-on savoir pourquoi le remove n'a pas renvoyé 0, de préférence quelque soit la plateforme.
    errno contient le code de l'erreur quand remove retourne -1:
    EFAULT
    pathname pointe en dehors de l'espace d'adressage accessible.
    EACCES
    L'écriture dans le répertoire contenant pathname n'est pas autorisée pour l'UID effectif du processus, ou l'un des répertoires de pathname ne permet pas la recherche (exécution).
    EPERM
    Le répertoire contenant pathname à son Sticky-Bit (S_ISVTX) positionné, et l'UID effectif du processus n'est ni l'UID du fichier, ni celui du répertoire le contenant.
    ENAMETOOLONG
    pathname est trop long.
    ENOENT
    Un répertoire contenu dans pathname n'existe pas, ou est un lien symbolique pointant nulle part.
    ENOTDIR
    Un composant de pathname n'est pas un répertoire.
    ENOMEM
    Pas assez de mémoire pour le noyau.
    EROFS
    pathname est situé sur un système de fichiers en lecture seule.

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par soazig
    Bonjour,
    Je travaille sur un projet qui tourne sous VMS, unix, NT.
    Sous Unix, il semble qu'un fichier ne soit pas supprimé, j'aimerai en connaitre la raison.
    Voici le code de la fonction de suppression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int  f_supprimer_fichier(char * const nom_fichier_a_supprimer )
    {
    int retour;
    #ifndef V_UNIX
        char nom_fichier[1024];
        strcpy(nom_fichier,nom_fichier_a_supprimer);
        strcat(nom_fichier,";*");
        retour=remove(nom_fichier);
    #else
        retour=remove(nom_fichier_a_supprimer);
    #endif
    return retour;
    }
    En principe dans le cas posant problème on a V_UNIX positionné.
    Pour information sous VMS les fichiers sont versionné, et ont un nom du type Nom_fichier;version. Quand on fait un delete nom_fichier;* on supprime toutes les versions du fichier, d'où la concaténation.

    La question principale est peut-on savoir pourquoi le remove n'a pas renvoyé 0, de préférence quelque soit la plateforme.
    Merci
    Soazig
    As-tu une documentation de remove() avec des particularités pour ta plate-forme ? Car si remove() ne renvoie pas 0, la variable globale errno est positionnée à un certain code d'erreur. Je n'ai pas la norme C sous la main, mais avec un man remove sur ton système tu devrais avoir les codes d'erreur que peut prendre errno (un EACCESS peut-être). Mais pour cela il faut inclure <errno.h> et tester la variable errno.

    A+
    Foobar1329

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    On peut aussi inclure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <string.h> /* strerror() */
    afin d'utiliser la fonction strerror() qui permet de connaître la signification textuelle d'une valeur de errno.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("Origine de l'erreur: %s.\n",strerror(errno));

  5. #5
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Oui, ou utiliser perror() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <stdio.h>
    void perror (const char *s);
    qui est encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perror("Origine de l'erreur");
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  6. #6
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par zooro
    Oui, ou utiliser perror() qui est encore plus simple
    Oui c'est clair!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour, et merci
    Comme il n'y a pas de redirection du canal d'erreur standard dans mon environnement, le perror ne pourra pas être utilisé, en tout cas pas sous VMS.
    Voilà comment je compte m'y prendre
    Dans ma fonction je renvoie le errno, comme ça il n'est pas perdu
    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
     
    int  f_supprimer_fichier(char * const nom_fichier_a_supprimer )
    {
    int retour;
    #ifndef V_UNIX
        char nom_fichier[1024];
        strcpy(nom_fichier,nom_fichier_a_supprimer);
        strcat(nom_fichier,";*");
        retour=remove(nom_fichier);
    #else
        retour=remove(nom_fichier_a_supprimer);
    #endif
    if (retour!=0)
    {
      retour=errno;
    }
    return retour;
    }

    Et dans l'appelant je le récupère, quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    retour_supr= f_supprimer_fichier(nom_fichier);
    if (retour_supr!0);
    {
      tracer_chaine("erreur dans la suppresion du fichier",
                            strerror(retour_supr);
    }
    Sachant que tracer_chaine est la fonction qui me permet d'alimenter le fichier trace de l'application.

    Qu'en pensez-vous?

    Vu que le problème est surtout sur unix, et qu'en principe je développe sous vms, je dois attendre qu'un collègue se libère pour tester tout cela.
    Je vous tiens au courant dès que c'est testé.

    Merci encore.
    Soazig

  8. #8
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par soazig
    Comme il n'y a pas de redirection du canal d'erreur standard dans mon environnement, le perror ne pourra pas être utilisé, en tout cas pas sous VMS.
    Il me semble que le flux de sortie d'erreur est toujours disponible, non ? Au pire, il sera identique au flux de sortie standard.
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Citation Envoyé par zooro
    Il me semble que le flux de sortie d'erreur est toujours disponible, non ? Au pire, il sera identique au flux de sortie standard.
    Il ne s'agit pas d'une application console et honnetement je ne sais pas dérouter le flux de sortie d'erreur dans une transaction appelée par moniteur transactionnel ACMS sous VMS à partir d'un client windows.
    Vu que je peux m'en passer je ne vois pas pourquoi je chercherai 10 h pour le faire.
    Merci
    Soazig

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Coucou,
    Vous allez rire tellement c'est énorme le define V_UNIX n'était pas défini dans cette portion de code! Et unix n'aime pas la suppression du fichier toto.fic;*
    Il a mauvais gout!

    Je me suis posée la question en postant le code hier, et je me suis dit qu'il était défini.
    Conclusion, je n'ai eu à faire aucune des suggestions.
    A+
    Soazig

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par soazig
    Vous allez rire tellement c'est énorme le define V_UNIX n'était pas défini dans cette portion de code!
    Petite astuce pour savoir si une zone de compilation conditionnelle est active : placer (provisoirement) un piege :
    et recompiler. Si l'erreur se produit à la compilation, c'est que la zone est active.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Quelles sont vos raisons pour migrer vers Windows 7 ?
    Par shawn12 dans le forum Windows 7
    Réponses: 44
    Dernier message: 27/10/2009, 14h02
  2. Quelles sont vos raisons pour migrer vers Windows 7 ?
    Par shawn12 dans le forum Actualités
    Réponses: 0
    Dernier message: 14/08/2009, 15h32
  3. Réponses: 5
    Dernier message: 15/06/2009, 11h28
  4. Réponses: 2
    Dernier message: 08/07/2008, 10h50

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