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

Boost C++ Discussion :

Boost.filesystem et les chemins avec des espaces/signes


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut Boost.filesystem et les chemins avec des espaces/signes
    Bonjour à tous,

    J'essaie d'utiliser boost.filesystem avec des chemins contenant des espaces.
    Il s'agit du chemin "Application Data" (C:\Documents and Settings\usr\Application Data) sous Windows et du chemin "appdata" (un simple dossier appdata par rapport à l'exe) sous les autres OS.
    Pour la portablilité je sais que boost::filesystem::path ne supporte pas les racines, je supprime donc le C: sous Windows. Le problème c'est que boost::filesystem::path semble aussi ne pas supporter les espaces (pour des raisons de portablilité j'imagine).
    En effet lorsque je fournis à la classe path un chemin avec espaces je vois le message suivant sur la ligne de commande :
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    J'ai essayé avec la forme courte du chemin (/DOCUME~1/ADMINI~1/APPLIC~1) mais ça ne change rien.
    Pourtant pour un chemin comme par exemple "/chemin" tout fonctionne à merveille.
    J'aimerais donc savoir comment faire lorsqu'un chemin contient des espaces, pour que boost::filesystem::path l'accepte, si cela est possible bien sur.

    D'avance merci!

    Spartan03

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour la portabilité, Boost.Filesystem supporte la racine, c'est juste que sous Linux, il n'y en a pas, donc il n'y a pas d'intérêt à en mettre, je ne vois pas le pourquoi de l'argument de la portabilité.
    Ensuite, en ce qui concerne le plantage, le débuggage indique qu'il a lieu à quel endroit ?

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Question comme ça : As-tu bien indiqué que tu utilisais des chemins natifs ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 297
    Par défaut
    Tu n'aurais pas une exception qui s'échappe des fois ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Miles
    Ensuite, en ce qui concerne le plantage, le débuggage indique qu'il a lieu à quel endroit ?
    Le plantage à lieu lors de la construction de mon instance de path.

    Citation Envoyé par JolyLoic
    Question comme ça : As-tu bien indiqué que tu utilisais des chemins natifs ?
    Non, je ne vois pas comment faire pour l'indiquer lors de la construction de mon instance de path. Pourrais-tu me le dire?

    Citation Envoyé par Luc Hermitte
    Tu n'aurais pas une exception qui s'échappe des fois ?
    Euh, je n'avais pas pensé à récupérer les exceptions , j'ai fait mon petit bloc try/catch et effectivement! Lorsque je fournis un chemin avec racine j'ai l'exception suivante :
    noost::filesystem::path invalid name C: in path "C:/Documents and Settings/Administrateur/Application Data
    (A noter que j'ai remplacé les antislashs de Windows par des slashs).

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et tu as essayé avec "\ " ? - échappement des espaces sous Linux -

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Miles
    Et tu as essayé avec "\ " ? - échappement des espaces sous Linux -
    Oui mais la il y'a carrément un warning à la compilation (et toujours le même bug à l'éxécution qui me dit que "Documents and Settings" n'est pas valide dans le chemin "/Documents and Settings/Aministrateur/Application Data.
    Le warning c'est
    Citation Envoyé par MinGW
    warning: unknown escape sequence: '\040'
    J'imagine que c'est parce que je compile sous Windows.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pardon, il fallait mettre "\\ " pour échapper le '\'

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Désolé mais ça ne change rien hormis le fait que le invalid name soit "Documents\ and\ Settings" bien sur .

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    ...
    Aucune idée sur le coup...

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Tu pourrais nous donner ton code ?
    (un main compilable facilement rapidement)

    merci a+

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    OK pas de problème, j'en avais déja préparé un pour moi afin d'isoler mon problème.! Le voilà:

    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
    #include <iostream>
    #include <boost/filesystem/path.hpp>
    #include <boost/filesystem/convenience.hpp>
    #include <fstream>
     
    #include <windows.h>
    #include <shlobj.h>
    #include <algorithm>
     
    int main()
    {
     
        try
        {
        char chemin_c[MAX_PATH];
        SHGetFolderPath(NULL,CSIDL_APPDATA|CSIDL_FLAG_CREATE,NULL,0,chemin_c);
     
        //On remplace les \ bidons de Windows par les / d'Unix, afin de pouvoir
        //manipuler les fichiers grace aux flux de la bibliothèque standard fstream
        std::replace(chemin_c, chemin_c+MAX_PATH, '\\','/');
     
        //GetShortPathName(chemin_c, chemin_c, MAX_PATH); //J'avais essayé mais ça n'a pas marché ++
     
        //Suppression de la racine (idem ça ne bouge rien)
        //char* chemin_c2;
        //for(chemin_c2 = chemin_c; *chemin_c2 != '/';  chemin_c2++);
     
        std::cout << chemin_c << std::endl ;
     
        boost::filesystem::path chemin_config(chemin_c); // Ca bugue là!
     
        }
        catch(std::exception& ex)
        {
            MessageBox(NULL, ex.what(), "Exception", MB_OK|MB_ICONWARNING);
        }
     
     
     
    	return 0;
    }
    J'allais oublier, il faut bien sur linker la/les librairie statiques correspondant à boost::filesystem.

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    T'as essayé sans le changement de '\' en '/' ? Boost.filesystem supporte les 2 sous Windows, donc à priori pas besoin de faire de changements.

    De plus, ça ne compile pas, ça. MAX_PATH vaut quoi ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Miles
    T'as essayé sans le changement de '\' en '/' ? Boost.filesystem supporte les 2 sous Windows, donc à priori pas besoin de faire de changements.

    De plus, ça ne compile pas, ça. MAX_PATH vaut quoi ?
    Ce reviens au même, MAX_PATH vaut 260 je crois. Mais il me semblait qu'il était définit dans "windows.h"

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ah... mea culpa dans ce cas

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Victoire !!!!

    En utilisant le name_check "native" (ou "windows_name" vu que je tourne sous Windows XP) il accepte les espaces mais les antislashes (et les slashes aussi d'ailleurs!!) lui font péter un câble (en gros le name_check native retourne false!).

    Cepandant (j'ai bien fait de faire le test avant de poster, sinon j'allais encore en dire une ) bien que ce vieux name_check (native) retourne false, la construction de l'instance de path avec ce name_check se passe sans exceptions et d'ailleurs quand on utilise une racine de type "c:" tout est ok, de ++ lorsqu'on ne connait pas la racine (qu'on met "/") ça marche aussi nickel!!!
    Tout ça grâce à un name_check.
    Bon j'avoue que jusqu'à aujourd'hui je ne savais pas trop à quoi servaient ces petites fonctions et, en allant gratter dans l'implémentation de boost::filesystem j'ai compris à quoi elles servaient (les name_check functions je veux dire) !!!!

    Un petit bout de code qui marche!!! (Et en ++ vous n'avez pas à vous soucier du disque dur sur lequel créer les dossier!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boost::filesystem::path chemin_config("/bonjour", &boost::filesystem::native);
    boost::filesystem::create_directories(chemin_config);
    Voilà!!
    Ouf, pas faché de mettre ce sujet sur résolu !

    Merci à tous, et particulièrement à Miles, pour votre aide!!

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    desolé, j'etais en train de compiler boost avec mingw32 ...
    je ne pouvais pas t'aider avant ... desolé mais heureux que tu es trouvé le probleme. Par contre utiliser native n'est peut-etre pas une voie portable ...

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Citation Envoyé par epsilon68
    desolé, j'etais en train de compiler boost avec mingw32 ...
    je ne pouvais pas t'aider avant ... desolé mais heureux que tu es trouvé le probleme. Par contre utiliser native n'est peut-etre pas une voie portable ...
    T'inquiète, je sais à quel point compiler boost est long !
    Justement, je pense que native est portable puisque si je compile sous Windows, elle correspond à windows_name, sous unix, unix name etc...
    Je me trompe?!?

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par Spartan03
    T'inquiète, je sais à quel point compiler boost est long !
    Justement, je pense que native est portable puisque si je compile sous Windows, elle correspond à windows_name, sous unix, unix name etc...
    Je me trompe?!?
    tu as parfaitement raison,
    juste pour dire, boost est compilé avec mingw32 et j'arrive a utilser eclipse maintenant ... he he he

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

Discussions similaires

  1. Gérer un chemin avec des espaces
    Par helaaa dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/03/2013, 19h15
  2. Problème d'espaces dans les chemins avec Cygwin
    Par destructive dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 14/04/2008, 17h48
  3. Problème de chemin de fichier avec des espaces
    Par Akronyme dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 11/12/2006, 17h12
  4. os.system et chemins avec des espaces
    Par frenchy404 dans le forum Général Python
    Réponses: 3
    Dernier message: 08/12/2006, 22h03

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