将辅助扩展添加到 boost::filesystem::path 的正确方法是什么?

Nik*_*ker 4 c++ boost boost-filesystem

我想向路径附加附加扩展名:

namespace fs = boost::filesystem;
fs::path append_extension(const fs::path& path, const fs::path& ext);
Run Code Online (Sandbox Code Playgroud)

预期行为:

  • append_extension("foo.txt", ".log") -> "foo.txt.log"
  • append_extension("foo.txt", "log") -> "foo.txt.log"
  • append_extension("foo", "log") -> "foo.log"

append_extension是否可以在不使用点字符进行字符串操作的情况下实现?

seh*_*ehe 5

怎么样

namespace fs = boost::filesystem;
fs::path append_extension(const fs::path& path, const fs::path& ext) {
    auto sz_ext = ext.c_str();
    if ('.' == *sz_ext) ++sz_ext;
    return path.string<std::string>() + "." + sz_ext;
}
Run Code Online (Sandbox Code Playgroud)

是否可以在不使用点字符进行字符串操作的情况下实现append_extension?

不。扩展不是一个东西,它们只是约定。二次扩展甚至不是惯例,所以你只能靠自己了。

演示版

Live On Coliru

#include <boost/filesystem.hpp>
#include <boost/property_tree/string_path.hpp>

namespace fs = boost::filesystem;
fs::path append_extension(const fs::path& path, const fs::path& ext) {
    auto sz_ext = ext.c_str();
    if ('.' == *sz_ext) ++sz_ext;
    return path.string<std::string>() + "." + sz_ext;
}
#include <iostream>

int main() {
    std::cout << append_extension("foo.txt", ".log") << "\n"; // -> "foo.txt.log"
    std::cout << append_extension("foo.txt", "log") << "\n"; // -> "foo.txt.log"
    std::cout << append_extension("foo", "log") << "\n"; // -> "foo.log"
}
Run Code Online (Sandbox Code Playgroud)

印刷

"foo.txt.log"
"foo.txt.log"
"foo.log"
Run Code Online (Sandbox Code Playgroud)