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 起) |
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。
- 否則,首先確定 *this 和 base 的首個不匹配元素,如同以 auto [a, b] = mismatch(begin(), end(), base.begin(), base.end()),然後
- 若 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/=。
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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3070 | C++17 | 亦可為根名的檔名可能導致意外結果 | 被作為錯誤情況處理 |
LWG 3096 | C++17 | 末尾的 "/" 與 "/." 處理不正確 | 已更正 |
[編輯] 參閱
(C++17) |
組成一個相對路徑 (函式) |