附加到boost :: filesystem :: path

Zac*_*ack 32 c++ boost

boost::filesystem::path手头有一点,我想在它上面添加一个字符串(或路径).

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

唯一的过载boost::filesystem::pathappend需要打两次InputIterator秒.

到目前为止,我的解决方案是执行以下操作:

boost::filesystem::path p2(std::string(p.string()).append(".foo"));
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

hka*_*ser 61

如果它只是你想要改变的文件扩展名,那么你可能最好写一下:

p.replace_extension(".foo");
Run Code Online (Sandbox Code Playgroud)

对于大多数其他文件路径操作,您可以使用运算符/=/允许连接名称的各个部分.例如

boost::filesystem::path p("c:\\dir");
p /= "subdir";
Run Code Online (Sandbox Code Playgroud)

会参考c:\dir\subdir.

  • 如果没有扩展名,则不添加扩展名(至少不在1.35中).如果有一个它会替换它,这不是**我想要的.我只是想**追加**.按照我建议的代码,我现在如何解决它,看看我想要什么. (3认同)
  • 我正在使用Boost 1.35,所以我还没有replace_extension.但即便如此,我也看不出你认为它如何解决我的问题.我想**追加**一个"扩展名",而不是改变它.我在问题中说明了这一点,假设`path p("c:\\ dir")`,现在出现了将`abc`附加到`p`的东西,它应该导致`p`指向`c:\ dirabc `.运算符`/`也无法解决我的问题. (2认同)

小智 31

#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;
}
Run Code Online (Sandbox Code Playgroud)

测试1.37,但leafremove_leaf也记录在1.35中.你需要先测试p的最后一个组件是否是文件名,如果不是的话.

  • 我不确定这是否比我现在做的要好,但无论如何我都会接受. (2认同)

mar*_*iev 9

使用Filesytem库的第3版(Boost 1.55.0),它就像它一样简单

boost::filesystem::path p("one_path");
p += "_and_another_one";
Run Code Online (Sandbox Code Playgroud)

导致p = "one_path_and_another_one".

  • 但仍然没有`operator +(std :: string)`或`operator +(const char*)`.我不知道他们为什么要这么难. (10认同)
  • 找到它,它是1.50.0:http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html (2认同)
  • 2017年(1.64)也没有运气超载+ (2认同)

phi*_*inz 5

您可以自己定义+运算符,以便添加两个boost::filesystem::path变量。

inline boost::filesystem::path operator+(boost::filesystem::path left, boost::filesystem::path right){return boost::filesystem::path(left)+=right;}
Run Code Online (Sandbox Code Playgroud)

然后你甚至可以添加一个std::string变量(隐式转换)。这类似于operator/from的定义

包含/boost/文件系统/path.hpp:

inline path operator/(const path& lhs, const path& rhs)  { return path(lhs) /= rhs; }
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例:

主要.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;
}
Run Code Online (Sandbox Code Playgroud)

编译为

g++ main.cpp -lboost_system -lboost_filesystem
Run Code Online (Sandbox Code Playgroud)

产生输出:

$ ./a.out 
"/base/path/add/this.ext"
Run Code Online (Sandbox Code Playgroud)