名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | filesystem‎ | path
 
 
 
 
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) 返回以其通用格式轉換到規範形式*this
2) 返回相對於 base*this
  • 首先,若 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() 中的任何檔名能被解釋為根名 (root-name),則返回預設構造的 path。
  • 否則,首先確定 *thisbase 的首個不匹配元素,如同以 auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()),然後
  • a == end()b == base.end(),則返回 path(".")
  • 否則,定義 N[b, base.end()) 中既非亦非點點的非空檔名元素數量,減去點點檔名元素數量,若 N < 0,則返回預設構造的 path,
  • 否則,若 N = 0a == end() || a->empty(),則返回 path(".")
  • 否則返回由以下部分組成的物件
  • 一個預設構造的 path(),後隨
  • N 次應用 operator/=(path("..")),後隨
  • 對於半開範圍 [aend()) 中的每個元素應用一次 operator/=
3)lexically_relative(base) 的值不是空路徑,則返回它。否則返回 *this

目錄

[編輯] 引數

(無)

[編輯] 返回值

1) 路徑的規範形式。
2) 路徑的相對形式。
3) 路徑的鄰近形式。

[編輯] 異常

可能丟擲實現定義的異常。

[編輯] 注意

這些轉換是純粹詞法上的。它們不檢查路徑是否存在,不跟隨符號連結,且完全不訪問檔案系統。對於 lexically_relativelexically_proximate 的跟隨符號連結的對應版本,見 relativeproximate

在 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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3070 C++17 亦可為根名的檔名可能導致意外結果 被作為錯誤情況處理
LWG 3096 C++17 末尾的 "/" 與 "/." 處理不正確 已更正

[編輯] 參閱

組成一個相對路徑
(函式) [編輯]