【问题标题】:Why do std::filesystem::path::compare() and boost::filesystem::path::compare() differ?为什么 std::filesystem::path::compare() 和 boost::filesystem::path::compare() 不同?
【发布时间】:2020-04-13 16:44:38
【问题描述】:

给定以下代码:

  fs::path p{ "a/b/" };
  fs::path q{ "a/b/." };  
  assert(p == q);         

[注意定义 q 的字符串末尾的额外点。]

根据上述情况,boost::filesystem 接受 p == q 为真,但 gcc 和 llvm 的 std::filesystem 实现说它是假的。

为什么 boost 和 std 之间存在差异?

附:在这个问题的先前版本中,我错误地认为在比较之前应该对路径进行规范化。事实并非如此。即便如此,boost 和 std 之间的差异对我来说仍然是一个谜。

【问题讨论】:

  • 你为什么希望它们比较相等?
  • Dot 确实引用了它自己,为什么不呢?
  • 恕我直言好多了。也许我应该告诉你,虽然我对任何事情都感兴趣,但我对任何事情都无能为力。虽然要知道我是否可以先尝试理解这个问题。抱歉,如果我提出了错误的期望,但如果您同意这是一种改进,那当然不是为了我,而是为了您增加获得答案的机会
  • "按照我的理解,比较应该在路径归一化后进行。"为什么?我会说"a/b/""a/b/." 是命名相同条目的不同路径
  • @ Caleth:a) 第一个原因,正如我在问题中提到的,是“a/.././b”和“a///..//.// //b" 比较相等。它们是命名相同条目的不同路径,以使用您的语言,但它们比较相等。这意味着某种规范化正在进行中。 b) 重要的是,Boost 不同意你的观点。

标签: c++ boost-filesystem std-filesystem


【解决方案1】:

简短的回答是 Unix 上的 . 是一个实际的文件系统节点链接,这有时很重要。见this stack overflow answer

编辑

但是,我不能假定知道标准委员会关于文件系统库行为的意图,我也不认为库对 Unix 符号链接行为有太多了解是合理的。简而言之,这可能是也可能不仅仅是标准措辞与 Boost 对事情应该如何工作的看法的一个怪癖。

【讨论】:

  • 据我所知,路径比较是在不访问文件系统的情况下执行的。恐怕它比这更深。
  • @Curious: "路径比较是在不访问文件系统的情况下执行的" 但是路径比较必须以这样一种方式定义,如果两条路径相等,它们肯定应该在文件系统中命名相同的实体。如果 . 在某些情况下可以被视为不同的实体,那么逻辑路径相等性测试必须认识到这一点。
  • @Nicol Bolas:正确。这就是为什么该标准具有“规范化”路径的规则。例如,在标准中,您可以参考:29.11.7.1 通用路径名格式 [f​​s.path.generic],特别是第 6 小节:通用格式路径名的规范化。再次,请参阅我的完整帖子,以及我对 Caleth 的回复,上面。特别是,我的最后一点:boost 提供了不同的答案。
猜你喜欢
  • 2018-02-18
  • 2011-04-23
  • 2016-06-02
  • 1970-01-01
  • 2012-07-06
  • 2012-01-23
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多