web-dev-qa-db-fra.com

Ajout pour booster :: système de fichiers :: chemin

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 InputIterators.

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?

29
Zack
#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.

30
Roger Pate

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.

56
hkaiser

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".

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

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"
0
phinz