2010-03-07 11 views
29

Mam pod ręką pewien boost::filesystem::path i chciałbym dodać do niego ciąg (lub ścieżkę).Dodanie do boost :: filesystem :: path

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

Jedynym przeciążenie boost::filesystem::path ma od append chce dwa InputIterator s.

Moje rozwiązanie jakim jest wykonanie następujących czynności:

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

Am I czegoś brakuje?

Odpowiedz

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

Testowane 1,37, ale liści i remove_leaf są udokumentowane w 1.35. Musisz przetestować, czy ostatni składnik z p jest nazwą pliku, jeśli nie jest.

+2

Nie jestem pewien, czy to jest lepsze niż to, co obecnie robię, ale i tak to przyjmuję. – Zack

+0

@Zack: Jest bardzo blisko tego, co masz. Zacząłem od interfejsu API 1.42, zauważyłem twoje komentarze na temat drugiej odpowiedzi na temat 1.35 i pracowałem wstecz, aby to uzyskać. Jest to jednak łatwiejsze do sprawdzenia, np. jeśli p.leaf() == "." (ponieważ p == "/ some/dir /"). –

50

Jeśli to naprawdę tylko rozszerzenie nazwy pliku, który chcesz zmienić to jesteś prawdopodobnie lepiej pisanie:

p.replace_extension(".foo"); 

dla większości innych operacji ścieżka do pliku można użyć operatorów /= i / pozwalające łączyć części imię. Na przykład:

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

będzie odnosić się do c:\dir\subdir.

+2

pracuję z Boost, 1.35 więc nie mam jeszcze replace_extension.Ale mimo to nie widzę, jak myślisz, że rozwiązuje mój problem. Chcę ** dodać ** "rozszerzenie", a nie go zmienić. Zilustrowałem to w pytaniu, przypuśćmy, że 'path p (" c: \\ dir ")', teraz przychodzi coś co doda 'abc' do' p', co powinno skutkować 'p' wskazującym na' c: \ dirabc '. Operator '/' również nie może pomóc w rozwiązaniu mojego problemu. – Zack

+1

Powinieneś wspomnieć, że używasz Boost V1.35. Istnieje ogólna funkcja replace_extension (path) działająca tak samo jak opisana powyżej. Dodatkowo, replace_extension po prostu dodaje rozszerzenie, jeśli żadne nie jest już obecne. Jeśli chcesz zmodyfikować części ścieżki (na przykład część katalogu, powiedz c: \\ dir \\ bla do c: \\ dirfoo \\ bla), musisz rozdzielić ścieżkę, zmodyfikować części path (które są po prostu ciągami) z dowolną funkcją napisu, którą wolisz i potem je zestawia. Nie ma mowy o tym ... – hkaiser

+3

Nie dodaje rozszerzenia, jeśli go nie ma (przynajmniej nie w 1.35). A jeśli tak jest, to go zastąpi, co nie jest ** tym, czego chciałem. Po prostu chcę ** dołączyć **. Postępuj zgodnie z moim sugerowanym kodem na temat tego, jak go teraz rozwiązuję, aby zobaczyć, co chcę. – Zack

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

W wersji 3 biblioteki systemem plików (boost 1.55.0) to tak proste, jak to tylko

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

powodując p = "one_path_and_another_one".

+6

Ale nadal nie ma operatora + (std :: string) 'lub' operator + (const char *) '. Nie wiem, dlaczego muszą tak utrudniać. –

+0

Każdy pomysł w jakiej dokładnej wersji został dodany? http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/release_history.html nie jest pomocny, a nowsze wersje wydają się nie istnieć ... – Ela782

+2

Znaleziono 1.50 .0: http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html – Ela782

0

Możesz samodzielnie zdefiniować operatora +, aby dodać dwie zmienne boost::filesystem::path.

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

Wtedy można nawet dodać std::string zmienną (niejawna konwersja). Jest to podobne do definicji operator/ od

include/Boost/plików/path.hpp:

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

Oto przykład roboczych:

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

skompilowana z

g++ main.cpp -lboost_system -lboost_filesystem 

produkuje wyjście:

$ ./a.out 
"/base/path/add/this.ext" 
Powiązane problemy