web-dev-qa-db-de.com

Wird an boost :: filesystem :: path angehängt

Ich habe einen bestimmten boost::filesystem::path in der Hand und möchte einen String (oder Pfad) anhängen.

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

Die einzige Überladung, die boost::filesystem::path von append hat, will zwei InputIterators.

Meine Lösung bisher ist folgendes zu tun:

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

Fehlt mir etwas?

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;
}

Getestet mit 1.37, aber leaf und remove_leaf sind auch in 1.35 dokumentiert. Sie müssen zunächst prüfen, ob die letzte Komponente von p ein Dateiname ist, falls dies nicht der Fall ist.

30
Roger Pate

Wenn es sich wirklich nur um die Dateinamenerweiterung handelt, die Sie ändern möchten, sollten Sie wahrscheinlich besser schreiben:

p.replace_extension(".foo");

für die meisten anderen Dateipfadoperationen können Sie die Operatoren /= und / verwenden, um Teile eines Namens zu verketten. Zum Beispiel

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

bezieht sich auf c:\dir\subdir.

56
hkaiser

Mit Version 3 der Filesytem-Bibliothek (Boost 1.55.0) ist es so einfach wie nur

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

was p = "one_path_and_another_one" ergibt.

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

Sie können den +-Operator selbst definieren, sodass Sie zwei boost::filesystem::path-Variablen hinzufügen können.

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

Dann können Sie sogar eine std::string-Variable hinzufügen (implizite Konvertierung). Dies ist ähnlich der Definition des operator/ von 

include/boost/filesystem/path.hpp:

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

Hier ist ein Arbeitsbeispiel:

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;
}

zusammengestellt mit

g++ main.cpp -lboost_system -lboost_filesystem

produziert die Ausgabe:

$ ./a.out 
"/base/path/add/this.ext"
0
phinz