从两个绝对路径获取相对路径

2024-03-18

我有两个绝对文件系统路径(A 和 B),并且我想生成第三个文件系统路径来表示“A 相对于 B”。

使用案例:

  • 管理播放列表的媒体播放器。
  • 用户将文件添加到播放列表。
  • 新文件路径已添加到播放列表相对于播放列表路径.
  • 将来,整个音乐目录(包括播放列表)都会转移到其他地方。
  • 所有路径仍然有效,因为它们是相对于播放列表的。

boost::filesystem似乎有complete解决relative ~ relative => absolute,但没有什么可以反过来做(absolute ~ absolute => relative).

我想用Boost路径来做到这一点。


使用 C++17 及其std::filesystem::relative https://en.cppreference.com/w/cpp/filesystem/relative,它是从 boost 演变而来的,这是理所当然的:

#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    const fs::path base("/is/the/speed/of/light/absolute");
    const fs::path p("/is/the/speed/of/light/absolute/or/is/it/relative/to/the/observer");
    const fs::path p2("/little/light/races/in/orbit/of/a/rogue/planet");
    std::cout << "Base is base: " << fs::relative(p, base).generic_string() << '\n'
              << "Base is deeper: " << fs::relative(base, p).generic_string() << '\n'
              << "Base is orthogonal: " << fs::relative(p2, base).generic_string();
    // Omitting exception handling/error code usage for simplicity.
}

输出(第二个参数是基数)

Base is base: or/is/it/relative/to/the/observer
Base is deeper: ../../../../../../..
Base is orthogonal: ../../../../../../little/light/races/in/orbit/of/a/rogue/planet

It uses std::filesystem::path::lexically_relative https://en.cppreference.com/w/cpp/filesystem/path/lexically_normal进行比较。 与纯词法函数的区别在于,std::filesystem::relative解析符号链接并使用以下方法规范化两个路径std::filesystem::weakly_canonical https://en.cppreference.com/w/cpp/filesystem/canonical(这是为relative) 比较之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从两个绝对路径获取相对路径 的相关文章

随机推荐

  • 从 gcc 的中间文件编译目标文件

    通过使用 fdump 树 flag 可以在源代码文件编译期间转储一些中间格式文件 我的问题是是否可以使用该中间文件作为 gcc 的输入来获取最终的目标文件 我问这个是因为我想向中间文件添加一些代码gimple 通过使用标志获得 fdump
  • 在 AWK 中将空白字段替换为零

    我希望使用 awk 将空白字段替换为零 但是当我使用 sed s 0 文件时 当我只想考虑丢失的数据时 我似乎会替换所有空格 由于某些空字段 使用 awk print NF 文件返回不同的字段号 即 9 4 input 590073920
  • Eclipse PDT + xdebug:单步执行损坏的代码

    我使用 PHP 5 6 2 和 xdebug 2 2 5 以及 Eclipse 4 4 1 和 PDT 3 3 1 我正在尝试在本地服务器 localhost 上设置调试器 xdebug 但有些东西似乎被破坏了 当我启动调试会话时 Ecli
  • t sql“select case”与“if ... else”以及有关“开始”的解释

    我对 t sql 的经验很少 我必须编写一个存储的 这是我存储的 USE myDatabase GO SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO CREATE PROCEDURE dbo
  • java中String类如何用构造函数初始化

    public String String original this value original value this hash original hash 我不明白原始数据是如何转换为字符数组的 如果我用不同的代码尝试它 它会抛出编译错
  • 在 C# 中实现 OPOS 设备

    对于与旧版 POS 应用程序的某些互操作 我想知道是否可以在 C 中实现虚假的 OPOS 设备 基本上我会实现一个假键盘 它接受网络请求并将按键传递给遗留应用程序 有谁知道这是否可能或在哪里可以获得文档 我认为 OPOS 只是调用由注册表项
  • 将多列粘贴在一起

    我在数据框中有一堆列 我想将它们粘贴在一起 用 分隔 如下所示 data lt data frame a 1 3 b c a b c c c d e f d c g h i i e a b c d 1 a d g 2 b e h 3 c f
  • 如何对 Django 数据库迁移进行单元测试?

    我们使用 django 迁移 django v1 7 更改了数据库 数据库中存在的数据不再有效 基本上我想通过在单元测试中构建预迁移数据库 添加一些数据 应用迁移来测试迁移 然后确认一切顺利 一个人如何 加载单元测试时阻止新的迁移 I fo
  • 没有 AVAsset 的纯色 AVMutableComposition

    这是我的最终目标 我想使用AVVideoCompositionCoreAnimationTool从 Core Animation 创建视频 我不会在此组合中使用现有的 AVAsset 我的问题是 我该如何使用AVMutableComposi
  • 猫鼬预保存和验证之间的区别?什么时候使用哪一个?

    目前我正在使用pre save 进行验证 UserSchema pre save true function next done var self this in case inside a callback var msg helper
  • Angular 4 材质是否像 bootstrap 一样响应式?

    我正在使用 Angular 4 开始一个新项目 需要创建响应灵敏且令人愉悦的用户界面 bootstrap 为您提供响应能力 但没有物质感 棱角分明的材质提供了良好的 UI 体验https material angular io https
  • 防止箭头键更改选定的单选按钮

    我有几个单选按钮 我想阻止按下向上 向下箭头键来更改选定的单选按钮 如果您选择其中一个单选按钮 然后按向上 向下箭头键 它将选择上一个或下一个单选按钮 相反 我希望选择保持不变 为此我可以使用event preventDefault 在某些
  • Jgrid 生成 XML 时出现问题

    我正在使用 Jgrid 我像我们大多数人一样使用 Xml 将数据注入到网格中 我想要批量更新数据库 我的要求是 当我单击 保存更改 时 它会生成当前 更新的 网格数据的 Xml 那么 我如何生成Jgrid数据的Xml 请帮忙 这是代码
  • C++ 模板:返回 list::iterator

    我怎样才能使下面的代码工作 在编译过程中 我收到一条错误消息 告诉我searchForResource函数没有返回类型 template
  • 为什么我的 UILabel 不显示 NSInteger

    我有一个 ViewController 和 GameController 类 它是 NSObject 的子类 视图控制器有一个链接到它的按钮 并触发一个初始化 GameController 类的 IBAction 在 GameControl
  • 剪切背景以露出下面的图层

    有没有办法剪切 div 背景以暴露下面的图层 就像这样 to this 欢迎任何前沿的 CSS 规则 UPDATE 好的 我做了一个示例代码 http jsfiddle net coma 9ae7g 1 http jsfiddle net
  • 创建新文件时,vscode 让我选择一个编辑器

    When creating a new file vscode let me select an editor It hasn t do so and I don t want to choose one because I only us
  • 我应该如何处理 Perl 中不再使用的对象?

    我正在编写一个链接到外部资源的类 其中一种方法是破坏外部资源的删除方法 不应对该对象进行进一步的方法调用 我正在考虑设置一个标志 如果设置了标志 那么就会在所有方法中死亡 但是有没有更好 更简单的方法呢 也许涉及破坏 到目前为止 我真的很喜
  • Android Studio:“libpng 警告:iCCP:无法识别已编辑的已知 sRGB 配置文件”

    我花了几个小时试图解决这个问题 app mergeDebugResources AAPT err 927129865 C Users Will AndroidStudioProjects Splitter2 app build interm
  • 从两个绝对路径获取相对路径

    我有两个绝对文件系统路径 A 和 B 并且我想生成第三个文件系统路径来表示 A 相对于 B 使用案例 管理播放列表的媒体播放器 用户将文件添加到播放列表 新文件路径已添加到播放列表相对于播放列表路径 将来 整个音乐目录 包括播放列表 都会转