2010-03-07 7 views
29

J'ai un certain boost::filesystem::path en main et j'aimerais ajouter une chaîne (ou un chemin).Ajout à boost :: filesystem :: path

boost::filesystem::path p("c:\\dir"); 
p.append(".foo"); // should result in p pointing to c:\dir.foo 

La surcharge que boost::filesystem::path a des append veut deux InputIterator s.

Ma solution est à ce jour pour faire ce qui suit:

boost::filesystem::path p2(std::string(p.string()).append(".foo")); 

Est-ce que je manque quelque chose?

Répondre

28
#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 


int main() { 
    boost::filesystem::path p (__FILE__); 

    std::string new_filename = p.leaf() + ".foo"; 
    p.remove_leaf() /= new_filename; 
    std::cout << p << '\n'; 

    return 0; 
} 

Testé avec 1,37, mais feuille et remove_leaf sont également documentées dans 1.35. Vous devrez tester si le dernier composant de p est un nom de fichier en premier, si ce n'est pas le cas.

+2

Je ne sais pas si c'est mieux que ce que je fais actuellement mais je l'accepte quand même. – Zack

+0

@Zack: C'est très proche de ce que vous avez. J'avais commencé avec l'API 1.42, j'ai remarqué vos commentaires sur l'autre réponse à propos de 1.35, et j'ai travaillé en arrière pour l'obtenir. Cependant, ceci est plus facile à vérifier, par ex. si p.leaf() == "." (parce que p == "/ some/dir /"). –

50

Si c'est vraiment juste l'extension de nom de fichier que vous voulez changer, alors vous êtes probablement mieux écrit:

p.replace_extension(".foo"); 

pour la plupart des autres opérations de chemin de fichier que vous pouvez utiliser les opérateurs /= et / permettant de concaténer parties de un nom. Par exemple

boost::filesystem::path p("c:\\dir"); 
p /= "subdir"; 

se référera à c:\dir\subdir.

+2

Je travaille avec Boost 1.35 donc je n'ai pas encore replace_extension.Mais même ainsi, je ne peux pas voir comment vous pensiez que cela résout mon problème. Je veux ** ajouter ** une "extension", ne pas le changer. J'ai illustré cela dans la question, supposons que 'path p (" c: \\ dir ")', vient maintenant quelque chose qui ajoutera 'abc' à' p', ce qui devrait aboutir à 'p' pointant vers' c: \ dirabc '. L'opérateur '/' ne peut pas aider avec mon problème. – Zack

+1

Vous devriez avoir mentionné que vous utilisez Boost V1.35. Là, vous avez une fonction globale replace_extension (path) faisant la même chose que je l'ai décrit ci-dessus. De plus, replace_extension ajoute simplement une extension si aucune n'est déjà présente. Si vous voulez modifier des parties de votre chemin (par exemple une partie de répertoire, disons c: \\ dir \\ bla à c: \\ dirfoo \\ bla) vous devez séparer le chemin, modifier les parties du chemin chemin (qui sont juste des chaînes) avec n'importe quelle fonction de chaîne que vous préférez et les mettre ensemble après. Pas moyen de contourner cela ... – hkaiser

+3

Il n'ajoute pas d'extension s'il n'y en a pas (au moins pas dans 1.35). Et s'il y en a un, il me le remplacera, ce qui n'est pas ** ce que je voulais. Je veux simplement ** ajouter **. Suivez mon code suggéré sur la façon dont je le résous maintenant pour voir ce que je veux. – Zack

4
path p; 
std::string st = "yoo"; 
p /= st + ".foo"; 
9

il est aussi facile avec la version 3 de la bibliothèque système de fichier (Boost 1.55.0) comme juste

boost::filesystem::path p("one_path"); 
p += "_and_another_one"; 

entraînant p = "one_path_and_another_one".

+6

Mais toujours pas d'opérateur + (std :: string) 'ou' operator + (const char *) '. Je ne sais pas pourquoi ils doivent le rendre si difficile. –

+0

Une idée dans quelle version exacte cela a été ajouté? http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/release_history.html n'est d'aucune aide et les nouvelles versions ne semblent pas exister ... – Ela782

+2

Trouvés, c'est 1.50 .0: http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html – Ela782

0

Vous pouvez définir vous-même l'opérateur + de sorte que vous puissiez ajouter deux variables boost::filesystem::path.

inline boost::filesystem::path operator+(boost::filesystem::path left, boost::filesystem::path right){return boost::filesystem::path(left)+=right;} 

Ensuite, vous pouvez même ajouter une variable (conversion implicite) std::string. Ceci est similaire à la définition du operator/ de

include/boost/système de fichiers/path.hpp:

inline path operator/(const path& lhs, const path& rhs) { return path(lhs) /= rhs; } 

Voici un exemple de travail:

main.cpp:

#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 

using namespace boost::filesystem; 
inline path operator+(path left, path right){return path(left)+=right;} 

int main() { 
    path p1 = "/base/path"; 
    path p2 = "/add/this"; 
    std::string extension=".ext"; 
    std::cout << p1+p2+extension << '\n'; 
    return 0; 
} 

compilé avec

g++ main.cpp -lboost_system -lboost_filesystem 

produit la sortie:

$ ./a.out 
"/base/path/add/this.ext" 
Questions connexes