J'ai un certain boost::filesystem::path
en main et j'aimerais y ajouter une chaîne (ou un chemin).
boost::filesystem::path p("c:\\dir");
p.append(".foo"); // should result in p pointing to c:\dir.foo
La seule surcharge que boost::filesystem::path
a de append
veut deux InputIterator
s.
Ma solution jusqu'ici consiste à faire ce qui suit:
boost::filesystem::path p2(std::string(p.string()).append(".foo"));
Est-ce que je manque quelque chose?
#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 leaf et remove_leaf sont également décrits dans 1.35 . Vous devrez d'abord vérifier si le dernier composant de p est un nom de fichier, si ce n'est pas le cas.
S'il ne s'agit que de l'extension de nom de fichier que vous souhaitez modifier, il est probablement préférable d'écrire:
p.replace_extension(".foo");
pour la plupart des autres opérations de chemin de fichier, vous pouvez utiliser les opérateurs /=
et /
permettant de concaténer des parties d'un nom. Par exemple
boost::filesystem::path p("c:\\dir");
p /= "subdir";
fera référence à c:\dir\subdir
.
Avec la version 3 de la bibliothèque Filesytem (Boost 1.55.0), rien de plus simple!
boost::filesystem::path p("one_path");
p += "_and_another_one";
résultant en p = "one_path_and_another_one"
.
path p;
std::string st = "yoo";
p /= st + ".foo";
Vous pouvez définir vous-même l'opérateur +
de manière à pouvoir 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 std::string
(conversion implicite). Ceci est similaire à la définition du operator/
de
include/boost/filesystem/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"