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