2010-03-07 60 views
29

我手頭有一個boost::filesystem::path,我想追加一個字符串(或路徑)給它。追加到boost :: filesystem :: path

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

唯一的過載boost::filesystem::pathappend需要打兩次InputIterator秒。

我的解決方法到目前爲止是做到以下幾點:

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

我缺少的東西?

回答

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

與1.37測試,但remove_leaf也記錄在1.35。您需要測試p的最後一個組件是否是文件名,如果它不是。

+2

我不確定這是否比我目前所做的更好,但無論如何我都會接受它。 – Zack 2010-03-07 18:54:56

+0

@Zack:這與你所擁有的非常接近。我已經開始使用1.42 API,注意到你對另一個關於1.35的答案的評論,並且爲了得到這個而反向工作。然而,這很容易檢查,例如如果p.leaf()==「。」 (因爲p ==「/ some/dir /」)。 – 2010-03-07 19:17:01

50

如果它真的只是文件擴展名要更改,那麼你可能會更好過寫作:

p.replace_extension(".foo"); 

大多數其他文件的路徑操作,您可以使用運營商/=/允許拼接的部分一個名字。例如

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

將參照c:\dir\subdir

+2

我與升壓1.35工作,所以我沒有replace_extension呢。但即使如此,我也看不到你認爲它如何解決我的問題。我想**追加**一個「擴展名」,而不是改變它。我在這個問題中說明了這一點,假設'path p(「c:\\ dir」)'現在出現了將'abc'附加到'p'的東西,這會導致'p'指向'c:\ dirabc '。運算符'/'也不能解決我的問題。 – Zack 2010-03-07 14:51:09

+1

你應該提到你使用Boost V1.35。在那裏你有一個全局函數replace_extension(path),與前面描述的一樣。另外,如果不存在,replace_extension只需添加一個擴展。 如果你想修改路徑的一部分(例如一個目錄部分,比如c:\\ dir \\ bla到c:\\ dirfoo \\ bla),你需要把路徑分開,修改部分路徑路徑(只是字符串)與你喜歡的任何字符串函數,然後把它們放在一起。沒有辦法解決這個問題... – hkaiser 2010-03-07 15:14:03

+3

如果沒有擴展名(至少不在1.35),它不會添加擴展名。如果有一個它會替代我,這是**不**我想要的。我只是想**追加**。按照我的建議代碼,我現在正在解決它,看看我想要什麼。 – Zack 2010-03-07 15:31:32

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

隨着Filesytem庫(升壓1.55.0)第3版是剛剛

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

導致p = "one_path_and_another_one"一樣容易。

+6

但仍然沒有'operator +(std :: string)'或'operator +(const char *)'。我不知道他們爲什麼要這麼做。 – 2014-11-24 13:49:11

+0

任何想法在什麼確切的版本這是添加? http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/release_history.html沒有任何幫助,新版本似乎不存在... – Ela782 2015-07-28 14:26:27

+2

找到它,它是1.50 .0:http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html – Ela782 2015-07-28 14:31:53

0

您可以自己定義+運算符,以便您可以添加兩個boost::filesystem::path變量。

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

然後你甚至可以添加一個std::string變量(隱式轉換)。這類似於從

的的operator/的定義包括/升壓/文件系統/ path.hpp:

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

這裏是一個工作示例:

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

編號爲

g++ main.cpp -lboost_system -lboost_filesystem 

產生輸出:

$ ./a.out 
"/base/path/add/this.ext" 
相關問題