Ajout à boost::filesystem:: path

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 boost::filesystem::path a append veut deux InputIterators.

Ma solution jusqu'à présent est de faire ce qui suit:

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

Est-ce que je manque quelque chose?

29
demandé sur Zack 2010-03-07 17:20:52

5 réponses

#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 de 1,37, mais feuille et remove_leaf sont également documentées dans 1.35. Vous devrez d'abord tester si le dernier composant de p est un nom de fichier, s'il ne l'est pas.

30
répondu 2010-03-07 15:50:51

Si c'est vraiment juste l'extension de nom de fichier que vous souhaitez modifier, alors vous êtes probablement mieux 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.

53
répondu hkaiser 2010-03-07 14:34:09

Avec la version 3 de la bibliothèque Filesytem (Boost 1.55.0), c'est aussi simple que

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

Résultant en p = "one_path_and_another_one".

9
répondu martemiev 2014-01-15 17:27:22
path p;
std::string st = "yoo";
p /= st + ".foo";
4
répondu leon le bourdon 2011-02-15 15:49:31

Vous pouvez définir vous-même l'opérateur + de sorte que vous pouvez 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

Inclure/boost/système de fichiers/chemin d'accès.hpp:

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

Voici un exemple de travail:

Principal.rpc:

#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"
0
répondu phinz 2018-02-03 16:05:55