2010-03-07 62 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" 
相关问题