【问题标题】:Obtain platform's path separator using Boost.Filesystem使用 Boost.Filesystem 获取平台的路径分隔符
【发布时间】:2012-01-13 03:27:21
【问题描述】:

有没有办法使用Boost.Filesystem 获取平台的路径分隔符?通过路径分隔符,我的意思是 / 用于 Unix,\ 用于 Windows。

我已经知道我可以使用boost::filesystem::path::operator/ 将两条路径与适当的分隔符连接在一起。但我只想要/\

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

编辑: 我想使用 Boost.Filesystem API 的version 3,就像在 Boost 1.48 中使用的那样。

【问题讨论】:

  • 天啊!我一直在寻找一个可以直接给我路径分隔符的 API,并没有想到简单地使用:boost::filesystem::path("/").native()
  • 有人可以确认boost::filesystem::path("/").native() 在Windows 上返回"\\" 吗?
  • 请注意,Windows 接受 / 作为 pafh 分隔符。
  • @Xeo:谢谢,这让我的问题对我目前正在做的事情毫无意义。但我还是很好奇boost::filesystem::path("/").native() 在 Windows 上的行为。
  • WinXP,VS2010,boost 1.48.0,返回值为“/”。

标签: c++ boost boost-filesystem


【解决方案1】:

从 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 将错误地假定 /.
【解决方案2】:

好像boost::filesystem::path::make_preferred 是票:

效果:包含的路径名被转换为首选的本机 格式。 [注意:在 Windows 上,效果是将斜杠替换为 反斜杠。在 POSIX 上,没有效果。 -- 尾注]

例子:

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

【讨论】:

  • 在 windows 上这将无法编译,因为 native() 将返回 std::wstring。不过,这与这个问题的目的无关。
  • @AI0867:谢谢,我在示例中将std::string 替换为bfs::path::string_type
【解决方案3】:

尚未对此进行测试,但看起来您应该能够在最近的提升中使用它:

http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/reference.html

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

int main() {
    std::cout << boost::filesystem::slash<boost::filesystem::path>::value << std::endl;
}

【讨论】:

  • 遗憾的是,slash 似乎不再是 API 的一部分。
猜你喜欢
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2014-07-29
  • 1970-01-01
  • 2018-04-25
  • 2011-06-03
相关资源
最近更新 更多