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

Langage C++ Discussion :

petit problème d'utilisation de PathFileExists


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut petit problème d'utilisation de PathFileExists
    bonjour à tous.

    depuis hier, j'essai d'utiliser la fonction PathFileExists dans un progrtamme en C++, mais sans succès. La fonction me retourne toujours false. Je pense que ça doit être un petit truc, mais j'arrive pas à voir quoi. voici le petit bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* dossier="C:\\Program Files";
    	if (PathFileExists(LPCWSTR(dossier))==true){
    		cout<<"existe"<<endl;}
    	else {cout<<"existe pas"<<endl;}
    la compilation se passe nickel, mais le résultat ne colle pas.
    J'avais trouvé ça sur internet, mais je ne pense pas pas être dans ce cas:

    This function returns FALSE if a mounted remote drive is out of service.

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,
    Je crois qu'il faut entrer un chemin de fichier ( "C:\\Program Files\\MonFichier.txt" par exemple ) et non le chemin d'un répertoire comme tu l'as fait dans l'extrait de code que tu donnes.
    On peut le voir dans l'exemple donné ici

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    ça ne fait aucune différence, je viens de faire le test avec ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* dossier="C:\\Program Files\\Avira\\AntiVir Desktop\\about.htm";
    	if (PathFileExists(LPCWSTR(dossier))==true){
    		cout<<"le fichier existe"<<endl;}
    	else {cout<<"le fichier n'existe pas"<<endl;}
    je suis sur que ce fichier existe, mais il me met que ça n'existe pas.

    Puis sur la page de la fonction (officiel de microsoft) il y a marqué ça:

    Determines whether a path to a file system object such as a file or directory is valid
    j'ai ai déduit que ça marchait pour les fichiers ou les dossiers

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut peut-être voir ce qu'indique GetLastError ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    qu'est ce ?

    [edit]oublie ma question, je suis en train de chercher[/edit]

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    j'ai ajouté ça comme ligne de code à la fin du programme pour avoir le résultat de GetLastError

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<GetLastError<<endl;
    et le résultat:

    7680F196

    et ça, même google ne sait pas ce que ça veut dire

  7. #7
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut
    Par hasard, est-ce que le fait que les répertoires que tu utilises aient des espaces dans leurs noms ne serait pas la source du problème?

    Peux-tu tester sur un répertoire n'ayant pas d'espace dans son nom?

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *dossier="C:\\Intel\\Logs";
    	if (PathFileExists(LPCWSTR(dossier))==true){
    		cout<<"le fichier existe"<<endl;}
    	else {cout<<"le fichier n'existe pas"<<endl;}
    	 cout<<GetLastError<<endl;
    même réponse, alors que le dossier existe. j'ai fais un test avec un fichier également, et même résultat).

    et toujours la même erreur pour GetLastError (s'il s'agit d'une erreur)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Pardon, je me suis mal exprimé... GetLastError() renvoie l'identifiant de l'erreur, mais il faut passer par FormatMessage() pour obtenir un message explicit... Voir ici

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    merci pour ces précisions. mais pour être honnête, je n'ai pas compris le fonctionnement de cette fonction. C'est une fonction disponible directement ? il faut la reécrire ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    GetLastError() et FormatMessage() sont des fonctions fournies par microsoft. L'exemple montre juste comment les utiliser et permet d'afficher le message d'erreur dans une boite de dialogue. En ce qui te concerne tu peux réduire le code à ceci :

    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
     
    const char *dossier="C:\\Intel\\Logs";
    if (PathFileExists(LPCWSTR(dossier))==true)
    {
    	cout<<"Le fichier existe"<<endl;
    }
    else 
    {
    	cout<<"Le fichier n'existe pas"<<endl;
     
    	LPVOID lpMsgBuf;   /// zone de mémoire utilisée pour stocker le message d'erreur
     
    	DWORD dw = GetLastError(); /// récupère l'identifiant de l'erreur
     
        FormatMessage(  /// fonction qui rend intelligible le message
            FORMAT_MESSAGE_ALLOCATE_BUFFER |  /// indique que la fonction doit allouer elle même l'espace nécessaire
            FORMAT_MESSAGE_FROM_SYSTEM |      /// inqique que c'est message système
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,                      /// paramètre inutile dans ce cas
            dw,                        /// identifiant de l'erreur
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /// langue
            (LPTSTR) &lpMsgBuf,  /// zone où le message sera stocké
            0, NULL );  /// paramètres inutiles dans ce cas
     
    	wcout << "Erreur : " << (LPCTSTR) lpMsgBuf << endl; /// nécessite <wostream>
     
    	LocalFree(lpMsgBuf); /// libère la mémoire alloué dans la fonction FormatMessage()
    }

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    j'ai copié/collé ton code, aucune erreur: chapeau

    sinon, la fonction me retourne :

    Erreur:le fichier spùcifiù est introuvable
    j'ai ai déduit que ça voulait dire que le fichier était introuvable XD

  13. #13
    Invité
    Invité(e)
    Par défaut
    Je viens de remarquer qu'il indiqué, tout en bas de la page de msdn sur PathFileExists (celle-ci) que la fonction peut échouer si l'antivirus kapersky est activée. Ce n'est pas ton cas ?

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Si au lieu de faire des casts pour supprimer les warning ( ici LPCWSTR(dossier)) on cherche à les comprendre, ça éviterait les erreurs ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        std::wstring dossier=L"C:\\Program Files";
    	if (PathFileExists(dossier.c_str())==true){
    		std::cout<<"existe"<<endl;}
    	else {std::cout<<"existe pas"<<endl;}
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        WCHAR dossier=L"C:\\Program Files";
    	if (PathFileExists(dossier.c_str())==true){
    		std::cout<<"existe"<<endl;}
    	else {std::cout<<"existe pas"<<endl;}

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    Citation Envoyé par Joe Dralliam Voir le message
    Je viens de remarquer qu'il indiqué, tout en bas de la page de msdn sur PathFileExists (celle-ci) que la fonction peut échouer si l'antivirus kapersky est activée. Ce n'est pas ton cas ?
    non, j'ai AviraAntivir.

    sinon 3DArchi, je viens de tester ton code, il marche !!!

    Merci beaucoup !!!

    Par contre, est ce qu'il serait possible d'avoir quelques explication sur ton code ? Je ne comprends pas pourquoi il faut déclarer la variable dossier en wstring, et pourquoi on met un L devant le chemin.

    en tout cas, merci à tous !!

  16. #16
    Invité
    Invité(e)
    Par défaut
    La déclaration d'une chaine préfixée par L permet d'indiquer au compilateur que c'est un chaine de caractères larges ( wide characters en anglais, ce qui donne le type wchar_t pour les stocker), c'est à dire faisant plus de 8 bits et pouvant donc contenir des caractères spéciaux. Un chaine du genre L"xxx" est donc du type wchar_t const* et le standard fournit, pour toutes les classes manipulant des caractères une variante (en fait un typedef) pour les caractères larges : wstring, wstringstream, wfstream, wcout, wclog, wcerr...

  17. #17
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    ok. pour être honnête, je ne suis pas sur d'avoir tout saisi, mais je crois que j'ai capté l'essentiel.

    en tout cas merci beaucoup, tu a résolu mon problème

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par poutch Voir le message
    ok. pour être honnête, je ne suis pas sur d'avoir tout saisi,
    Une seule chose à retenir : les cast sont à bannir : PathFileExists(LPCWSTR(dossier)) !!! Si le compilo te sort un warning ou une erreur, ce n'est pas un hasard.

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

Discussions similaires

  1. Petit problème d'utilisation de ce forum
    Par ovni76 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 26/09/2014, 18h45
  2. [XL-2010] Petit problème dans l'utilisation D'END(Xldown)
    Par kapoo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/03/2013, 14h05
  3. utiliser fseek dans un petit problème
    Par fred_sell dans le forum Débuter
    Réponses: 18
    Dernier message: 29/01/2010, 13h30
  4. Réponses: 5
    Dernier message: 17/11/2009, 20h37
  5. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35

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