【问题标题】:Using boost::filesystem::path as a key in an std::map使用 boost::filesystem::path 作为 std::map 中的键
【发布时间】:2012-12-07 11:23:26
【问题描述】:

所以 std::map 想要对键类型进行排序,但我遇到了问题:

"a/b"

"a/b"

如何规范化足以创建排序的路径?这甚至可能吗?我尝试在自定义比较运算符中使用 path::generic_string() ,但它不起作用。 fs::equivalent() 也无济于事,因为实现相等性对于 std::map 是不够的,它需要排序。这也是为什么这个问题与How do I "normalize" a pathname using boost::filesystem? 不重复的原因。

上下文:仅限 Windows,Boost 1.49,文件系统 3。

【问题讨论】:

  • 你列出的那些 == 没有文件系统的 operator== 重载,是吗?文档将 a==b 列为 !(a
  • @ltjax 编辑了 ==,我的意思是等价的。

标签: windows boost boost-filesystem


【解决方案1】:

要使路径具有可比性,您需要将它们转换为 canonical 表示,然后通过字符串进行比较。规范路径是绝对的、规范化的并且已删除符号链接。 Boost 提供规范的 AFAIK。因为需要解析符号链接,所以调用 canonical 需要访问文件系统。

【讨论】:

  • 不:fs::canonical(fs::path("C:\\Temp\\boost\\test.txt")) -> "C:/Temp\boost\test.txt ",但是 fs::canonical(fs::path("c:/temp//boost/test.txt")) -> "c:/temp\boost\test.txt"。
  • 好吧,经过仔细检查,我想它可以满足我的所有需求,除了改变大小写。所以 boost::to_lower_copy(fs::canonical(path).string()) 应该可以解决问题。
  • 可惜 boost::fs 没有告诉你 fs 是否区分大小写。
猜你喜欢
  • 2018-02-18
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2012-01-23
  • 1970-01-01
  • 2018-01-16
  • 2012-07-06
相关资源
最近更新 更多