如何替换从boost :: filesystem :: weakly_relative和std :: filesystem :: canonical

时间:2018-01-12 15:43:07

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

函数boost::filesystem::canonical()doc of 1.66doc of current release)提供两个参数(忽略错误代码重载)base。第一个是规范化的路径,第二个参数是用于使第一个路径绝对的基本路径(如果它是相对路径)。默认情况下,current_path()用于此参数。

Boost 1.60引入了一些新功能,其中包括boost::filesystem::weakly_canonical()doc of 1.66doc of current release)。这个函数缺少第二个参数。标准化(C ++ 17)变体std::filesystem::canonical()std::filesystem::weakly_canonical()(见cppreference)也是如此。

我想与canonical()交换weakly_canonical(),但我使用了第二个参数。这就是我意识到这个论点被删除的方式。现在我想知道为什么它被删除了,我怎么能让路径绝对自己。

我发现defect report暗示了this resolution for C++17,但坦率地说,我并没有真正理解这个理由。我会对一个解释感到高兴,或者更好的例子,其中基础的重载将被过度指定。

当然,我想知道如何使用不是当前目录的基本目录将相对路径转换为绝对路径。我是否应该在cppreference for std::filesystem::absolute()上使用base / p,因为我知道这是我目标系统上的正确表单(使用Visual C ++的Windows)?

1 个答案:

答案 0 :(得分:0)

好的,这是您拥有相对路径并希望调用此类函数时可能遇到的情况:

  1. 您知道路径是相对于current_path
  2. 您知道通过调用absolute可以使路径成为绝对路径。请注意,由于像Windows这样的文件系统,这与不一样表示它与current_path相关。
  3. 您知道路径是相对于某个已知的absolute_path而不是当前路径。
  4. 你不知道路径是否相对。
  5. 在#4的情况下,你的第一步需要是找出它是否是相对的,如果是,那么它是相对的。完成后,您将回到案例1-3。

    在每种情况1-3中,您都可以直接计算绝对路径。在案例1中,您使用current_path() / rel。在案例2中,您使用absolute(rel)。在案例3中,您使用absolute_path / rel。 (注意:这不仅仅是#34;我目标系统上的正确表单(使用Visual C ++的Windows)",这是正确的表单期间。)

    canonical/weakly_canonical的原始版本中,函数仅处理案例1和3.案例2在函数中无法处理。通过使函数更低级别,使它们使用absolute作为相对路径而不是采用默认为current_path()的基本路径,这允许函数处理案例2以及其他案例。

    他们本可以对其进行更改,以便过载不会使用current_path()的路径(而非默认absolute)。但实际上,canonical(rel, absolute_path)canonical(absolute_path / rel)之间的区别是什么?实际上,后者使你做得更清楚,因为它把绝对路径放在左边,就在它的位置。