【问题标题】:boost::filesystem - how to create a boost path from a windows path string on posix platforms?boost::filesystem - 如何在 posix 平台上从 Windows 路径字符串创建提升路径?
【发布时间】:2011-02-26 19:50:15
【问题描述】:

我正在从数据库中读取路径名,这些路径名以 Windows 格式存储为相对路径,并尝试在 Unix 系统上从它们创建 boost::filesystem::path。发生的情况是构造函数调用将整个字符串解释为文件名。我需要将路径转换为正确的 Posix 路径,因为它将在本地使用。

我没有在 boost::filesystem 参考中找到任何转换函数,也没有通过谷歌找到任何转换函数。我只是瞎了眼,有明显的解决方案吗?如果没有,你会怎么做?

例子:

std::string win_path("foo\\bar\\asdf.xml");
std::string posix_path("foo/bar/asdf.xml");

// loops just once, as part is the whole win_path interpreted as a filename
boost::filesystem::path boost_path(win_path);
BOOST_FOREACH(boost::filesystem::path part, boost_path) {
    std::cout << part << std::endl;
}

// prints each path component separately
boost::filesystem::path boost_path_posix(posix_path);
BOOST_FOREACH(boost::filesystem::path part, boost_path_posix) {
    std::cout << part << std::endl;
}

编辑:当然我可以只替换反斜杠,但是有没有一种解决方案可以同时适用于 Windows 和 Unix 平台?

【问题讨论】:

    标签: c++ boost filesystems


    【解决方案1】:

    不幸的是,Windows 路径语法是有条件编译的,并且仅在 Windows 上编译时包含。我不明白他们为什么这样做。无论如何,这意味着您始终最多有两个解析器可用;便携式的,与 Posix 相同,本地的,这取决于您当前正在编译的平台。

    可以“正常工作”的是将所有路径存储为可移植 (Posix) 格式。您可以在所有平台上同样简单地解析它。

    【讨论】:

    • 遗憾的是,我可能不会更改数据库中的格式,所以我将不得不替换反斜杠...
    【解决方案2】:

    用斜杠替换反斜杠怎么样?

    【讨论】:

    • 显而易见的答案 :) 由于路径字符串中的一些可疑转义,是否有某种方式可能出错?我希望有一些 boost::filesystem 解决方案,它可以为 Windows 和 Linux 做正确的事情,而不需要我做进一步的工作(lazy)。
    • 并非所有文件系统都支持相同的文件名,因此在极端情况下(或恶意用户)可能会出现问题。您可以查看数据库以查看是否有任何问题。
    • 我发现这篇文章几乎有同样的问题,除了我必须处理绝对或相对 Windows 路径。很奇怪,POSIX 解析器将正确处理 C:/foo/bar 而不是 C:\foo\bar。尽管如此,这是真的,所以即使是绝对路径替换斜线也应该有效。
    【解决方案3】:

    查看头文件,我发现如果您定义 BOOST_WINDOWS_PATH(在包含头文件之前),它会在 Windows 路径算法中编译。我不知道它是否可以在 Windows 之外运行。

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 2021-04-25
      • 1970-01-01
      • 2012-04-27
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      相关资源
      最近更新 更多