【发布时间】:2015-09-29 00:42:31
【问题描述】:
boost::filesystem::canonical(const path& p) 的文档指出:
概述:将必须存在的 p 转换为没有符号链接、点或点-点元素的绝对路径。
...
备注:!exists(p) 是一个错误。
这样做的结果是,如果 p 识别出目标不存在的符号链接,则函数将失败并返回 file not found 并且不返回路径。
这对我来说似乎过于严格:仅仅因为链接的目标不存在,我看不出函数无法解析该不存在目标的 path 的原因。 (相比之下,absolute() 没有这样的限制。)
(显然,如果路径内的符号链接被破坏,则无法解析目标路径。)
那么,这种限制是否有正当理由?
即使有,是否也有理由创建一个没有此限制的函数变体? (如果没有这样的变体,获取路径需要手动复制 canonical() 已经完成的 99% 的错误。)
我很欣赏stat() 和lstat() 之间存在的语义微妙之处同样适用于这种情况——这正是我认为该函数的变体同样合理的原因。
注意:这个问题同样适用于基于boost::filesystem 的std::experimental::filesystem 库(n4100)。
编辑:
在下面@Jonathan Wakeley 的知识渊博的回答之后,我仍然保留了我最初问题的本质,我将稍微重新构建:
boost::filesystem::canonical()要求目标存在是否有潜在的技术或逻辑原因?我的意思是,目标的不存在是否会导致无法解析规范形式的路径?如果不是,是否有任何技术或逻辑原因 不 提出仅与现有形式不同的功能变体 不要求目标存在?
在
boost::filesystem到提议的N4100std::experimental::filesystem的转换(据我了解是这种情况)中,是否经过适当考虑采用了对canonical()的限制,或者只是“落空” ' 来自 Boost 定义?
编辑 2:
我注意到 Boost 1.60 现在提供了函数 weakly_canonical():“返回 p 并解析符号链接并标准化结果。返回:在由前导元素组成的路径上调用 canonical() 函数的结果组成的路径存在的 p 的元素(如果有),后跟 p 的不存在的元素(如果有)。”
编辑 3:
More discussion of this 与 std::filesystem 相关。
【问题讨论】:
-
来晚了,但是...如果
canonical()给出了指向那个不存在的符号链接目标的路径,一秒钟后目标 gets 创建了 作为指向不同位置的符号链接,canonical()早先返回的路径会违反canonical()的约定,不是吗? (只是问。) -
是的,但
canonical()返回的any 结果可能会立即过期。例如,如果canonical()返回现有 文件的路径并且路径的任何部分随后被更改或删除,也可以这样说。事实上,由于它是作为每个路径组件的迭代解析实现的,canonical()容易受到文件系统更改在进行中的影响。 -
复制一下,谢谢你的澄清。
标签: c++ boost boost-filesystem c++17