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 :

Problème avec Boost.FileSystem : répertoire parent


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut [RÉSOLU]Problème avec Boost.FileSystem : répertoire parent
    Bonjour,

    je suis débutant en C++ et je cherche à faire une fonction qui utilise Boost.filesystem pour récupérer (dans une chaîne de caractères passée sous forme de pointeur à ma fonction) le répertoire parent d'un fichier donné.

    J'ai donc écrit un fichier de test :

    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
    #include<boost/filesystem/operations.hpp>
    #include<iostream>
    namespace bfs = boost::filesystem;
     
    // Librairies Standard
    #include <string.h>
     
    int main()
    {
      bfs::path p("../data/segmentation/campus_raw");
      if(bfs::exists(p))
        {
          std::cout<<"p.string() : "<<p.string()<<"\n";
          std::cout<<"is_directory(p) : "<<bfs::is_directory(p)<<"\n";
          std::cout<<"p.branch_path() : "<<p.branch_path()<<"\n";
          return 0;
        }
      else
        return -1;
    }
    Ça marche très bien quand je mets "../data/segmentation/campus_raw" (le répertoire parent renvoyé par p.branch_path() est "../data/segmentation").

    Mais quand je mets "../data/segmentation/campus_raw/" comme chemin de fichier, le programme me retourne "../data/segmentation/campus_raw" c'est-à-dire le nom du fichier d'entrée.

    Or les chaînes "../data/segmentation/campus_raw" et "../data/segmentation/campus_raw/" représentent le même fichier (qui est un répertoire en l'occurrence).

    Y a-t-il une autre fonction que branch_path() qui me permettrait d'obtenir le fichier parent quel que soit la façon dont le dossier est écrit (avec ou sans le séparateur final) ?

  2. #2
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Bonjour,
    pas à ma connaissance. Tu peux toujours regarder ici: http://matthieu-brucher.developpez.c...st/filesystem/

    C'est à toi de "faire attention" à ne pas ajouter ce slash à la fin de ton nom de fichier. Tu peux également écrire une fonction utilitaire pour verifier s'il y a ce fameux slash et s'il est présent le retirer de la chaine (pas compliqué à faire).

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    J'ai écrit ça mais je pense pas que ça marche sous Windows :

    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
    namespace bfs = boost::filesystem;
    
    string normaliserNomFichier(const string nomFichier)
    {
      if (bfs::is_directory(nomFichier) &&
          nomFichier[nomFichier.size()-1]!='/')
        {
          return nomFichier+"/";
        }
      else
        {
          return nomFichier;
        }
    }

  4. #4
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 40
    Points : 43
    Points
    43
    Par défaut
    Euh, c'est pas le contraire que tu essayes de faire ?
    Là tu normalises en disant "On ajoute un caractère / en fin de chaine s'il n'est pas présent". Or, tu cherches justement à faire l'inverse non ?

    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
     
    /**
        @brief Normaliser une chaine contenant un chemin.
     
        @param path Chaine à normaliser.
        @return la chaine normalisée.
    */
    std::string normalize(const std::string& path) {
        // On cherche le dernier slash.
        size_t pos = path.find_last_of('/');
     
        // Dernier slash trouvé, et il est le caractère de fin de chaine.
        if (pos != std::string::npos && path[path.size()-1] == '/') {
            // Elimination du dernier slash.
            return path.substr(0, path.size() - 1);
        }
     
        // Aucun traitement a effectuer sur la chaine.
        return path;
    }

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

Discussions similaires

  1. Problème avec JFileChooser et répertoire sur un poste distant.
    Par Dambrath dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 11/05/2009, 15h34
  2. Réponses: 19
    Dernier message: 16/09/2008, 11h44
  3. Boost filesystem : répertoire parent
    Par zarbiman dans le forum Boost
    Réponses: 1
    Dernier message: 22/03/2008, 15h12
  4. [boost] Problème avec boost::function
    Par Bakura dans le forum Boost
    Réponses: 3
    Dernier message: 22/03/2007, 20h08
  5. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 09h33

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