状态的文档boost::filesystem::canonical(const path& p)
:
概述:将必须存在的 p 转换为没有符号链接、点或点-点元素的绝对路径。
...
备注: !exists(p) 是一个错误。
这样做的结果是,如果 p 标识其目标不存在的符号链接,则该函数将失败file not found
并且不返回路径。
这对我来说似乎过于严格:仅仅因为链接的目标不存在,我看不出函数无法解析该不存在目标的路径的原因。(相比之下,absolute()
没有这样的限制。)
(显然,如果路径中的符号链接损坏,则无法解析目标路径。)
那么,这种限制有正当理由吗?
即使有,是否也有理由创建一个没有此限制的函数的变体?canonical()
(如果没有这样的变体,获取路径需要手动复制 99% 的已经完成的操作,这很容易出错。)
我很欣赏这种情况之间存在stat()
并lstat()
同样适用于这种情况的语义微妙之处——这正是我认为函数的变体同样合理的原因。
注意:这个问题同样std::experimental::filesystem
适用于基于boost::filesystem
.
编辑:
在@Jonathan Wakeley 下面的知识渊博的回答之后,我仍然保留了我最初问题的本质,我将稍微重新构建:
是否存在要求目标存在的潜在技术或逻辑原因?
boost::filesystem::canonical()
我的意思是,目标的不存在是否以某种方式使解决规范形式的路径变得不可能?如果没有,是否有任何技术或逻辑理由不提出仅与现有形式不同的功能变体,因为它不需要目标存在?
在转换为
boost::filesystem
提议的 N4100的过程中(据我了解是这种情况)std::experimental::filesystem
,是否在经过适当考虑后采用了这种限制canonical()
,还是只是从 Boost 定义中“落空”?
编辑2:
我注意到 Boost 1.60 现在提供了以下功能weakly_canonical()
:“返回 p 并解析符号链接并规范化结果。返回:在canonical()
由 p 的前导元素组成的路径上调用函数的结果组成的路径,如果存在的话,跟随p 中不存在的元素,如果有的话。”
编辑 3:
更多关于这个的讨论std::filesystem
。