【问题标题】:How to replace the base parameter removed from boost::filesystem::weakly_relative and std::filesystem::canonical如何替换从 boost::filesystem::weakly_relative 和 std::filesystem::canonical 中删除的基本参数
【发布时间】:2018-01-12 15:43:07
【问题描述】:

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

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

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

我发现了一个defect report,它暗示了this resolution for C++17,但坦率地说,我真的不明白其中的原因。我会很高兴有一个解释,或者更好的例子,其中 base 的重载会被过度指定。

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

【问题讨论】:

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


【解决方案1】:

好的,当你有一个相对路径并且想要调用这样一个函数时,你可能会遇到以下情况:

  1. 您知道路径是相对于current_path
  2. 您知道可以通过调用absolute 将路径设置为绝对路径。请注意,多亏了像 Windows 这样的文件系统,这与说它与current_path 相关,不是一回事
  3. 您知道该路径是相对于某个已知的absolute_path 而不是当前路径。
  4. 你不知道路径是否是相对的。

在第 4 种情况下,您的第一步需要确定它是否是相对的,如果是,那么它是相对于什么的。完成后,您将返回案例 1-3。

在每种情况 1-3 中,您都有一种直接计算绝对路径的方法。在情况 1 中,您使用 current_path() / rel。在情况 2 中,您使用 absolute(rel)。在情况 3 中,您使用 absolute_path / rel。 (注意:这不仅是“我的目标系统上的正确形式(Windows with Visual C++)”,这是正确的形式句号。)

canonical/weakly_canonical的原始版本中,函数只处理了案例1和3。案例2在函数内是不可能处理的。通过使函数更底层,通过使它们使用absolute 相对路径而不是采用默认为current_path() 的基本路径,这允许函数处理情况2 以及其他情况。

他们本可以改变它,这样就会有不采用路径的重载(而不是默认的current_path()),它会使用absolute。但实际上,canonical(rel, absolute_path)canonical(absolute_path / rel) 之间有什么区别?事实上,后者让你在做什么更清楚,因为它把绝对路径放在左边,这就是它要去的地方。

【讨论】:

  • 感谢您的回答。我想我的主要问题是我看不出 1 和 2 之间的区别。你能举个例子吗?您是否使用“文件系统 Windows”来指代 NTFS?如果abs_path / rel_path 正确的形式,那么为什么cppreference 中的非POSIX 提示?
  • cppreference 中的注释是针对特定情况的。这是说absolute 在 POSIX 文件系统上的行为方式是这样的。但在 Windows 上(例如),它没有。这才是重点。至于 1 和 2 之间的区别,这是因为文件系统上并不总是有一个“当前路径”。 d:myfile.txt 是相对路径。其正确的绝对版本使用D 驱动器当前使用的当前路径。这不一定与您从current_path 获得的相同。在 Windows 中,每个驱动程序都有一个单独的当前路径。
  • 有问题的相对路径是否带有根名称,例如"D:file.txt?当current_path() == "C:\\local" 那么absolute("D:file.txt") 可能返回"D:\\local\\file.txt"path("C:\\local") / path("D:file.txt") 返回"C:\\local\\D:file.txt"? (至少这是在 Windows 上使用 boost 1.56、Microsoft's std::tr2::sys implemenation 和微软实现 std::experimental::filesystem 的结果)
  • 好的,所以的问题。 (没有及时看到你的评论)从来没有想过这种相对路径。非常感谢。
  • 但是给定abs == path("C:\\local") != current_path()rel == path("D:file.txt") 那么没有函数会返回"D:\\local\\file.txt",我只能使用abs / rel 来检索非法路径"C:\\local\\D:file.txt"。我想我们将不得不忍受这一点。
猜你喜欢
  • 2020-11-04
  • 2017-12-30
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
相关资源
最近更新 更多