使用Boost.Filesystem获取平台的路径分隔符

19

如何使用Boost.Filesystem获取平台的路径分隔符呢?我所指的路径分隔符是Unix系统的/和Windows系统的\

我已经知道可以使用boost::filesystem::path::operator/函数来连接两个路径并得到适当的分隔符。但我只想要/\其中之一。

我也知道可以使用#ifdef _WIN32, 但我更希望Boost.Filesystem能告诉我适当的分隔符字符。

编辑: 我想使用版本3的Boost.Filesystem API,该API在Boost 1.48中使用。


哎呀!我一直在寻找一个可以直接给我路径分隔符的API,却没有想到可以简单地使用:boost::filesystem::path("/").native() - Emile Cormier
有人可以确认在Windows上boost::filesystem::path("/").native()返回的是"\\"吗? - Emile Cormier
3
知道了,Windows系统接受斜杠符号“/”作为路径分隔符。 - Xeo
@Xeo:谢谢,这使得我目前正在处理的问题无关紧要了。但我仍然对在Windows上使用boost::filesystem::path("/").native()的行为感到好奇。 - Emile Cormier
2
在WinXP上,使用VS2010和boost 1.48.0,返回值为“/”。 - fefe
3个回答

16

从版本1.57开始,Boost现在有一个更好的解决方案,即常量 char / wchar_t(取决于不同的平台):boost::filesystem::path::preferred_separator

阅读http://www.boost.org/doc/libs/release/libs/filesystem/doc/reference.html#Operating-system-examples获取更多信息。 它还具有更多的与系统相关的特性。

简单示例:

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

int main() {
    std::cout << boost::filesystem::path::preferred_separator << std::endl;
}

快速查看boost源代码可以发现,boost只是在预处理阶段使用ifdef获取分隔符。在这种情况下,不需要使用boost,但是如果他们在*nix系统上使用非标准文件系统,则boost将错误地假设/为分隔符。 - tom

14

看起来 boost::filesystem::path::make_preferred 是解决方案:

效果:将路径名转换为首选的本地格式。[注意:在Windows上,效果是用反斜杠替换斜杠。在POSIX上,没有影响。-- 结束注释]

示例:

namespace bfs = boost::filesystem;
bfs::path slash("/");
bfs::path::string_type preferredSlash = slash.make_preferred().native();

新的URL地址:http://www.boost.org/doc/libs/release/libs/filesystem/doc/reference.html#path-make_preferred - KindDragon
在Windows上编译将会失败,因为native()将返回std::wstring。然而,这与本问题的目的无关。 - AI0867
@AI0867:谢谢,我在示例中将std::string替换为bfs::path::string_type - Emile Cormier

1

1
遗憾的是,slash 看起来不再是 API 的一部分了。 - Emile Cormier

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