如何使用Boost在C++中获取带有尾部路径分隔符的路径

3

我有一个类似这样的路径:

boost::filesystem::path mypath("c:/test");
boost::filesystem::path mypath1("c:/test/);

我希望确保将它们转换为字符串时,两者都显示为:

c:/test/

例如,如果我执行以下操作:
cout<<mypath.string()<<endl;
cout<<mypath1.string()<<endl;

两者都会打印出:

c:/test/

如何使用boost在c++中实现这个功能?

我认为文件系统库中的任何标准函数都不支持您所需的功能,它总是将C:/test视为文件,将C:/test/视为目录 - 直到您检查它。最好的方法是将其转换为字符串,并检查其是否以路径分隔符结尾,如果没有,则将其添加到字符串中! - Nim
1个回答

1

我认为没有内置函数。

不过你可以使用以下方法:

if ("." != p.filename()) 
   p += fs::path::preferred_separator;

如果路径以/.结尾,则不会添加分隔符。

可选地,先调用p.remove_trailing_separator,但这也会删除任何尾部双斜杠(如果它是输入的一部分,某些应用程序将其视为具有重要意义)。

在 Coliru 上实时运行

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

namespace fs = boost::filesystem;

int main(int argc, char** argv) {
    for (std::string s : boost::make_iterator_range(argv+1, argv+argc)) {
        fs::path p = s;
        //p.remove_trailing_separator();
        if ("." != p.filename())
            p += fs::path::preferred_separator;

        std::cout << "'" << s << "'\t" << p << "\n";
    }
}

打印(在Linux上,显然):

'.' "."
''  "/"
'/' "//"
'/tmp'  "/tmp/"
'/tmp/' "/tmp/"
'/tmp//'    "/tmp//"
'/tmp/.'    "/tmp/."
'/tmp/..'   "/tmp/../"
'/tmp/...'  "/tmp/.../"
'/tmp/aa.txt'   "/tmp/aa.txt/"
'c:\test.txt'   "c:\test.txt/"

为什么您排除了“.”但没有排除“”? - sercxjo
@sercxjo 实际上,我不记得了。我认为 "" 只是一个糟糕的例子 - 它不是一个有效的路径,并且假设它意味着 "/" 是不安全的。因此,我建议输入验证,确保 "" 不是有效输入,并始终留下尾随的 /,包括 "./"。说实话,我认为真正的问题在于不太清楚输出格式对 OP 有什么影响(对我来说,/some/path/./ 并没有比 /some/path/. 更有意义。我的示例是选择反映要求有多奇怪,参见最后几个条目)。 - sehe
1
@sercxjo 噢。我(以及你)应该试一试。答案中的注释解释了它:“如果路径以 / 结尾,则不会添加分隔符。”比较一下:http://coliru.stacked-crooked.com/a/cb04270976fd76f6 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接