【问题标题】:Appending to boost::filesystem::path附加到 boost::filesystem::path
【发布时间】:2011-01-24 16:33:23
【问题描述】:

我手头有一个特定的boost::filesystem::path,我想给它附加一个字符串(或路径)。

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

boost::filesystem::path 的唯一重载是 append 需要两个 InputIterators。

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

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

我错过了什么吗?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    如果它真的只是你想要更改的文件扩展名,那么你最好写:

    p.replace_extension(".foo");
    

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

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

    将参考c:\dir\subdir

    【讨论】:

    • 我正在使用 Boost 1.35,所以我还没有 replace_extension。但即便如此,我也看不出你认为它如何解决了我的问题。我想追加一个“扩展”,而不是改变它。我在问题中说明了这一点,假设path p("c:\\dir"),现在出现了将abc 附加到p 的东西,这应该导致p 指向c:\dirabc。运营商/也帮不了我的问题。
    • 您应该提到您使用的是 Boost V1.35。那里有一个全局函数 replace_extension(path),与我上面描述的一样。此外,如果没有扩展名,replace_extension 只是简单地添加一个扩展名。如果要修改路径的某些部分(例如目录部分,例如 c:\\dir\\bla 到 c:\\dirfoo\\bla),则需要将路径分开,修改路径的部分(这只是字符串)与您喜欢的任何字符串函数,然后将它们放在一起。没有办法解决这个问题......
    • 如果没有扩展,它不会添加扩展(至少在 1.35 中没有)。如果有的话,它会为我替换它,这不是我想要的。我只是想追加。按照我建议的代码了解我现在如何解决它,看看我想要什么。
    • 虽然这可能不是问题的正确答案,但它为我解决了我的问题,所以 +1!
    【解决方案2】:
    #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 测试,但 leafremove_leaf 也记录在 1.35 中。您需要先测试 p 的最后一个组件是否是文件名,如果不是的话。

    【讨论】:

    • 我不确定这是否比我目前所做的更好,但无论如何我都会接受。
    • @Zack:它非常接近你所拥有的。我从 1.42 API 开始,注意到你的 cmets 在另一个关于 1.35 的答案上,并向后工作以获得这个。但是,这更容易检查,例如如果 p.leaf() == "." (因为 p == "/some/dir/")。
    【解决方案3】:

    使用第 3 版的 Filesytem 库 (Boost 1.55.0),一切就这么简单

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

    导致p = "one_path_and_another_one"

    【讨论】:

    【解决方案4】:
    path p;
    std::string st = "yoo";
    p /= st + ".foo";
    

    【讨论】:

      【解决方案5】:

      您可以自己定义+ 运算符,以便添加两个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/ 的定义

      include/boost/filesystem/path.hpp:

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

      这是一个工作示例:

      ma​​in.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"
      

      【讨论】:

        猜你喜欢
        • 2016-06-02
        • 2012-07-06
        • 2011-04-23
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 2012-01-23
        • 2019-01-31
        相关资源
        最近更新 更多