Namespaces
Variants

std::filesystem::path:: lexically_normal, std::filesystem::path:: lexically_relative, std::filesystem::path:: lexically_proximate

From cppreference.net
path lexically_normal ( ) const ;
(1) (C++17以降)
path lexically_relative ( const path & base ) const ;
(2) (C++17以降)
path lexically_proximate ( const path & base ) const ;
(3) (C++17以降)
1) このオブジェクトを 正規形式 に変換したジェネリック形式を返します。
2) * this base に対する相対パスとして返す。
  • まず、 root_name ( ) ! = base. root_name ( ) true であるか、または is_absolute ( ) ! = base. is_absolute ( ) true であるか、または ( ! has_root_directory ( ) && base. has_root_directory ( ) ) true であるか、または relative_path ( ) または base. relative_path ( ) 内のいずれかのファイル名が ルート名 として解釈できる場合、デフォルト構築されたpathを返す。
  • そうでない場合、まず auto [ a, b ] = mismatch ( begin ( ) , end ( ) , base. begin ( ) , base. end ( ) ) によって * this base の最初の不一致要素を決定し、その後
  • a == end ( ) かつ b == base. end ( ) の場合、 path ( "." ) を返す。
  • そうでない場合、 N [ b, base. end ( ) ) 内の空でないファイル名要素のうち、 ドット でも ドットドット でもないものの数から ドットドット ファイル名要素の数を引いた値として定義する。 N < 0 の場合、デフォルト構築されたpathを返す。
  • そうでない場合、 N = 0 かつ a == end ( ) || a - > empty ( ) の場合、 path ( "." ) を返す。
  • そうでない場合、以下の構成からなるオブジェクトを返す。
  • デフォルト構築された path ( ) に続けて
  • N 回の operator / = ( path ( ".." ) ) の適用、さらに続けて
  • 半開区間 [ a , end ( ) ) 内の各要素に対する operator / = の1回の適用。
3) lexically_relative ( base ) の値が空のパスでない場合、それを返す。それ以外の場合、 * this を返す。

目次

パラメータ

(なし)

戻り値

1) パスの正規形式。
2) パスの相対形式。
3) 経路の近接形式。

例外

実装定義の例外をスローする可能性があります。

注記

これらの変換は純粋に字句的です。パスが存在するかどうかのチェックは行わず、シンボリックリンクをたどらず、ファイルシステムに全くアクセスしません。 lexically_relative および lexically_proximate のシンボリックリンク追従版については、 relative および proximate を参照してください。

Windowsでは、返される path にはバックスラッシュ(推奨される区切り文字)が含まれます。

POSIXでは、相対パス内のいかなるファイル名も root-name として受け入れられません。

#include <cassert>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    assert(fs::path("a/./b/..").lexically_normal() == "a/");
    assert(fs::path("a/.///b/../").lexically_normal() == "a/");
    assert(fs::path("/a/d").lexically_relative("/a/b/c") == "../../d");
    assert(fs::path("/a/b/c").lexically_relative("/a/d") == "../b/c");
    assert(fs::path("a/b/c").lexically_relative("a") == "b/c");
    assert(fs::path("a/b/c").lexically_relative("a/b/c/x/y") == "../..");
    assert(fs::path("a/b/c").lexically_relative("a/b/c") == ".");
    assert(fs::path("a/b").lexically_relative("c/d") == "../../a/b");
    assert(fs::path("a/b").lexically_relative("/a/b") == "");
    assert(fs::path("a/b").lexically_proximate("/a/b") == "a/b");
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3070 C++17 ルート名としても解釈可能なファイル名が予期せぬ結果を引き起こす可能性がある エラーケースとして扱う
LWG 3096 C++17 末尾の "/" と "/." の処理が誤っている 修正済み

関連項目

相対パスを構成する
(関数)