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 :

Existance d'un fichier, d'une apps.


Sujet :

C

  1. #1
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut Existance d'un fichier, d'une apps.
    Voila mon probleme est tout simple, je veux savoir si une application d'on je connaitrais l'@ existe.
    J'ai essayer ceci, sans grand sucses...
    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
     
    void main()
    {
      char NOM_FICHIER[5][BUFSIZ],dossier_actuel[BUFSIZ]="\0",dossier_temp[BUFSIZ]="\0";
      FILE *P_FICHIER;      /* pointeur sur FILE */
      GetCurrentDirectory( 260 ,Dossier_actuel);
      sprintf(dossier_temp,"\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
      printf("%s ",dossier_temp);
      P_FICHIER = fopen(dossier_temp,"r");
      if ( P_FICHIER != NULL ) 
       { fclose(P_FICHIER);
          printf("1 : Boum.exe");
            //...   }
      //...
    }
    Mon "printf()"affiche le bon chemin, le fichier existe mais la condition n'est pas validée.
    Une Idée ?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par miron
    Une Idée ?
    Deux :
    - main() doit retourner un int (rien à voir avec ta question) ;
    - ajouter un "#include <errno.h>" et un "extern int errno;" au début de ton code, puis faire un " perror("erreur"); " quand l'ouverture échoue (sans rien faire entre l'échec et l'appel à perror() !) et nous donner le message affiché par perror().

  3. #3
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par David.Schris
    Deux :
    - main() doit retourner un int (rien à voir avec ta question) ;
    C'étais pour faire un programme pour vous qui soit compilable.
    Moi depuis un certain temps je mets tj int.
    - ajouter un "#include <errno.h>" et un "extern int errno;" au début de ton code, puis faire un " perror("erreur"); " quand l'ouverture échoue (sans rien faire entre l'échec et l'appel à perror() !) et nous donner le message affiché par perror().
    Citation Envoyé par perror()
    Erreur: Invalid argument

  4. #4
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    A tout hasard, est-ce normal que dossier_actuel ait une majuscule à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetCurrentDirectory( 260 ,Dossier_actuel);
    Le C est sensible à la casse

  5. #5
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    A tout hasard, est-ce normal que dossier_actuel ait une majuscule à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetCurrentDirectory( 260 ,Dossier_actuel);
    Le C est sensible à la casse
    Je sais, et je pensse de plus que c'est fort possible que tu ait raison, je vais verifier.
    Merci.
    PS: Ca ne resout qd meme pas mon probleme!

    VERIFICATION

    Apres verif en fait non car Dossier_actuel est un pointeur sur dossier_actuel, donc
    Dossier_actuel = @ de la premiere case du tableau dossier_actuel[].
    Et
    dossier_actuel = @ de la premiere case du tableau dossier_actuel[] aussi.
    D'où cela ne change rien.

  6. #6
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par miron
    Je sais, et je pensse de plus que c'est fort possible que tu ait raison, je vais verifier.
    Merci.
    PS: Ca ne resout qd meme pas mon probleme!

    Je ne fait pas de programmation Windows, donc je ne connais pas la fonction GetCurrectDirectory. Est ce que celle-ci retourne une valeur ? Si oui, tu pourrai peut-être la tester avant d'ouvrir ton fichier.

  7. #7
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    Je ne fait pas de programmation Windows, donc je ne connais pas la fonction GetCurrectDirectory. Est ce que celle-ci retourne une valeur ? Si oui, tu pourrai peut-être la tester avant d'ouvrir ton fichier.
    Oui il me semble quelle retourne une valeur, mais peu importe puisquelle marche.
    Comme je lai dit le chemin d'acces au fichier est le bon.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par miron
    C'étais pour faire un programme pour vous qui soit compilable.
    Mauvaise excuse : un main() retournant un int ne rend pas un programme non compilable (mais un main() retournant un int sans "return"...). Ce n'est pas pour t'embêter, c'est pour que tu prennes de bonnes habitudes.


    Citation Envoyé par miron
    Citation Envoyé par perror()
    Erreur: Invalid argument
    Citation Envoyé par man errno
    EINVAL Argument invalide.
    Citation Envoyé par man fopen
    ERREURS
    EINVAL Le mode fourni à fopen, fdopen, ou freopen était invalide.
    Mmmh... Je reste perplexe...

    Qu'affiche exactement (fais un copier/coller) ton " printf("%s ",dossier_temp); " ? (pense aussi à mettre la sortie de ton programme quand tu as un rpoblème, cela peut aider)

  9. #9
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Est ce que tu initialises errno à 0 avant l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    P_FICHIER = fopen(dossier_temp,"r");
    Personnellement, je ferai :

    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
     
    int main()
    {
      char NOM_FICHIER[5][BUFSIZ],dossier_actuel[BUFSIZ]="\0",dossier_temp[BUFSIZ]="\0";
      FILE *P_FICHIER;      /* pointeur sur FILE */
      GetCurrentDirectory( 260 ,Dossier_actuel);
      sprintf(dossier_temp,"\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
      printf("%s ",dossier_temp);
      errno = 0;
      P_FICHIER = fopen(dossier_temp,"r");
      if (P_FICHIER == NULL)
      {
         perror(dossier_temp);
         exit(EXIT_FAILURE);
      }
      if ( P_FICHIER != NULL ) 
       { fclose(P_FICHIER);
          printf("1 : Boum.exe");
            //...   }
      //...
     
      return EXIT_SUCCESS;
    }

  10. #10
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par David.Schris
    Mauvaise excuse : un main() retournant un int ne rend pas un programme non compilable (mais un main() retournant un int sans "return"...). Ce n'est pas pour t'embêter, c'est pour que tu prennes de bonnes habitudes.
    Mmmh... Je reste perplexe...
    Qu'affiche exactement (fais un copier/coller) ton " printf("%s ",dossier_temp); " ? (pense aussi à mettre la sortie de ton programme quand tu as un rpoblème, cela peut aider)
    Ces dernieres lignes mon fait comme un electrochoc, et j'ai penssasi dou pouvais provenir le probleme !!
    Ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(dossier_temp,"\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(dossier_temp,"%s%s",dossier_actuel,"\\Boum\\Boum.exe");
    Quil fallais mettre!!!
    Et la le code d'erreur est le bon:
    No such file or directory
    (car pour essais je l'ai suprimé)
    Donc un grand

  11. #11
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Il y a un truc aussi qui m'intrigues, c'est l'utilisation de sprintf avec dossier_temp qui est de taille BUFSIZE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(dossier_temp,"\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    dossier_temp est un tableau de char de même taille que dossier_actuel. Or, tu va stocker dans ce tableau une chaine dont on ne connais pas la taille. Utilise plutot snprintf, qui est plus sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    snprintf(dossier_temp, sizeof dossier_temp, "\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");

  12. #12
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    Il y a un truc aussi qui m'intrigues, c'est l'utilisation de sprintf avec dossier_temp qui est de taille BUFSIZE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(dossier_temp,"\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    dossier_temp est un tableau de char de même taille que dossier_actuel. Or, tu va stocker dans ce tableau une chaine dont on ne connais pas la taille. Utilise plutot snprintf, qui est plus sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(dossier_temp, sizeof dossier_temp, "\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");

    sprintf ou snprintf.???

  13. #13
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par miron

    sprintf ou snprintf.???
    snprintf pardon, le 'n' a sauté au passage. D'ailleurs, ca m'étonne que ton programme ait reussi l'instruction du sprintf sans broncher.

    Aussi, ici j'ai utilisé sizeof dossier_temp dans l'expression avec snprintf, car ton tableau est de type char. Tu peux tres bien mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    snprintf(dossier_temp, BUFSIZ, "\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    snprintf(dossier_temp, sizeof dossier_temp / sizeof dossier_temp[0], "\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    Si ton tableau avait été d'un autre type que char, il n'aurai surtout pas fallu utiliser sizeof(dossier_temp) tout seul.

    EDIT : suppression du E à BUFSIZE, ça risquerai d'en troubler quelque uns

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par miron

    sprintf ou snprintf.???
    snprintf()

  15. #15
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    snprintf(dossier_temp, BUFSIZE, "\"%s%s\"",dossier_actuel,"\\Boum\\Boum.exe");
    Pourquoi BUFSIZE et pas BUFSIZ

  16. #16
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par miron
    Pourquoi BUFSIZE et pas BUFSIZ
    Effectivement, BUFSIZ. D'ailleurs, c'est une macro que tu définie toi même ?

  17. #17
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    Effectivement, BUFSIZ. D'ailleurs, c'est une macro que tu définie toi même ?
    Euuu
    Arrette tu va trouver une faille dans mon programme qui fonctionne tres bien d'ailleur...

  18. #18
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par miron
    Euuu
    Arrette tu va trouver une faille dans mon programme qui fonctionne tres bien d'ailleur...
    C'est mon objectif. Un programme peut sembler bien fonctionner à première vue, et disposer de trou de sécurité dangereux.
    Un conseil : evite d'utiliser les fonctions de copie qui n'établissent aucun contrôle sur le nombre d'élement copié.

    Exemple :
    • sprintf -> snprintf
    • strcpy -> strncpy
    • gets -> fgets

    Cela t'evitera des mals de têtes à l'avenir

  19. #19
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par _kal_
    C'est mon objectif. Un programme peut sembler bien fonctionner à première vue, et disposer de trou de sécurité dangereux.
    Un conseil : evite d'utiliser les fonctions de copie qui n'établissent aucun contrôle sur le nombre d'élement copié.

    Exemple :
    • sprintf -> snprintf
    • strcpy -> strncpy
    • gets -> fgets

    Cela t'evitera des mals de têtes à l'avenir
    En fait sprintf m'à étais conseillé.

  20. #20
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par miron
    En fait sprintf mas aiai conseillé.

    Pas comprendre

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2012, 23h16
  2. Tester si une valeur existe dans un fichier
    Par medben7 dans le forum C
    Réponses: 4
    Dernier message: 14/01/2012, 01h46
  3. modifier un fichier XML avec une App
    Par demzu dans le forum Windows Phone
    Réponses: 1
    Dernier message: 16/05/2011, 15h26
  4. verifier l'existence d'un fichier sur une URL
    Par titsyal dans le forum Langage
    Réponses: 5
    Dernier message: 10/12/2009, 18h06
  5. Implémenter un fichier Word dans une APP VB.net
    Par xzéna dans le forum VB.NET
    Réponses: 6
    Dernier message: 15/03/2009, 17h04

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