最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<filesystem>

# std::filesystem::relative(C++17)

    namespace std::filesystem {
      path relative(const path& p, std::error_code& ec);                   // (1)
      path relative(const path& p, const path& base = current_path());     // (2)
      path relative(const path& p, const path& base, std::error_code& ec); // (3)
    }

## 概要

パスを現在の作業ディレクトリからの相対パスに変換する。

- (1) : 現在の作業ディレクトリからパス`p`への相対パスを構築する
- (2), (3) : パス`base`からパス`p`への相対パスを構築する

## 戻り値

- (1) : `return relative(p, current_path(), ec);`
- (2) : `return weakly_canonical(p).lexically_relative(weakly_canonical(base));`
- (3) : `return weakly_canonical(p, ec).lexically_relative(weakly_canonical(base, ec));`

(1)と(3)でエラーが発生した場合、`ec`にエラー情報が書き込まれ、`path()`が返る。

## 例外

- (1), (3) : 仕様上は未規定だが、パスのメモリ確保で例外が発生する可能性がある
- (2) : ファイルシステムがエラーを報告する場合がある。それに加えて、指定されたパス`p`と`base`のいずれの部分パスも存在しない場合でもエラーである。エラーが発生した場合は、`std::filesystem::filesystem_error` 例外を送出する

## 例

### POSIXベースシステムでの例

    #include <iostream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      // 現在の作業ディレクトリからの相対パスに変換する
      fs::path p1 = fs::relative("/a.txt");
      std::cout << p1 << std::endl;

      // 現在の作業ディレクトリからひとつ上の階層からの相対パスに変換する
      fs::path p2 = fs::relative("/a.txt", "../");
      std::cout << p2 << std::endl;
    }

#### 出力

    "../../a.txt"
    "../a.txt"

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++: