Namespaces
Variants

std::filesystem:: relative, std::filesystem:: proximate

From cppreference.net
ヘッダーで定義 <filesystem>
path relative ( const std:: filesystem :: path & p,
std:: error_code & ec ) ;
(1) (C++17以降)
(2) (C++17以降)
path relative ( const std:: filesystem :: path & p,

const std:: filesystem :: path & base,

std:: error_code & ec ) ;
(3) (C++17以降)
path proximate ( const std:: filesystem :: path & p,
std:: error_code & ec ) ;
(4) (C++17以降)
(5) (C++17以降)
path proximate ( const std:: filesystem :: path & p,

const std:: filesystem :: path & base,

std:: error_code & ec ) ;
(6) (C++17以降)
1) relative(p, current_path(), ec) を返します。
2,3) base に対する相対パスとなった p を返す。他の処理の前に、シンボリックリンクを解決し、 p base の両方を正規化する。実質的には std:: filesystem :: weakly_canonical ( p ) . lexically_relative ( std:: filesystem :: weakly_canonical ( base ) ) または std:: filesystem :: weakly_canonical ( p, ec ) . lexically_relative ( std:: filesystem :: weakly_canonical ( base, ec ) ) を返すが、エラーコード形式では、エラーが発生した場合、最初のエラー発生時に path ( ) を返す。
4) 戻り値 proximate ( p, current_path ( ) , ec ) .
5,6) 実質的に std:: filesystem :: weakly_canonical ( p ) . lexically_proximate ( std:: filesystem :: weakly_canonical ( base ) ) または std:: filesystem :: weakly_canonical ( p, ec ) . lexically_proximate ( std:: filesystem :: weakly_canonical ( base, ec ) ) を返します。ただし、エラーコード形式では、エラーが発生した場合、最初のエラー発生時に path ( ) を返します。

目次

パラメータ

p - 既存のパス
base - ベースパス。これに対して p が相対/近接パスとして作成される
ec - エラー状態を格納するエラーコード

戻り値

1) p current_path ( ) に対して相対化された。
2,3) p base に対して相対化された。
4) p current_path ( ) に対して近接化されました。
5,6) p base に対して近接化された。

例外

noexcept でマークされていないオーバーロードは、 メモリ確保に失敗した場合に std::bad_alloc をスローする可能性があります。

2,5) 下層のOS APIエラーが発生した場合、 std::filesystem::filesystem_error をスローします。この例外は、 p を第一パス引数、 base を第二パス引数、OSエラーコードをエラーコード引数として構築されます。
1,3,4,6) OS API呼び出しが失敗した場合、 std:: error_code & パラメータをOS APIエラーコードに設定し、エラーが発生しなかった場合は ec. clear ( ) を実行します。

#include <filesystem>
#include <iostream>
void show(std::filesystem::path x, std::filesystem::path y)
{
    std::cout << "x:\t\t " << x << "\ny:\t\t " << y << '\n'
              << "relative(x, y):  "
              << std::filesystem::relative(x, y) << '\n'
              << "proximate(x, y): "
              << std::filesystem::proximate(x, y) << "\n\n";
}
int main()
{
    show("/a/b/c", "/a/b");
    show("/a/c", "/a/b");
    show("c", "/a/b");
    show("/a/b", "c");
}

出力例:

x:               "/a/b/c"
y:               "/a/b"
relative(x, y):  "c"
proximate(x, y): "c"
x:               "/a/c"
y:               "/a/b"
relative(x, y):  "../c"
proximate(x, y): "../c"
x:               "c"
y:               "/a/b"
relative(x, y):  ""
proximate(x, y): "c"
x:               "/a/b"
y:               "c"
relative(x, y):  ""
proximate(x, y): "/a/b"

関連項目

(C++17)
パスを表現する
(クラス)
(C++17)
絶対パスを構成する
(関数)
正規パスを構成する
(関数)
パスを正規形式に変換する
パスを相対形式に変換する
パスを近接形式に変換する
( std::filesystem::path の公開メンバ関数)