3

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

Boost 1.60 引入了一些新功能,其中boost::filesystem::weakly_canonical()1.66文档,当前版本的文档)。此函数缺少第二个参数。标准化 (C++17) 变体std::filesystem::canonical()std::filesystem::weakly_canonical()(参见cppreference)也是如此。

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

我发现了一份缺陷报告,暗示了 C++17 的这个解决方案,但坦率地说,我并没有真正理解其中的原因。我会很高兴有一个解释或者更好的例子,其中 base 的重载会被过度指定。

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

4

1 回答 1

0

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

  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. (注意:这不仅是“我的目标系统上的正确形式(带有 Visual C++ 的 Windows)”,这还是正确的形式点。)

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

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

于 2018-01-12T16:40:22.517 回答