std::filesystem:: canonical, std::filesystem:: weakly_canonical
From cppreference.net
<
cpp
|
filesystem
|
ヘッダーで定義
<filesystem>
|
||
|
path canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(1) | (C++17以降) |
|
path canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(2) | (C++17以降) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p
)
;
|
(3) | (C++17以降) |
|
path weakly_canonical
(
const
std::
filesystem
::
path
&
p,
std:: error_code & ec ) ; |
(4) | (C++17以降) |
1,2)
パス
p
を正規の絶対パスに変換します。つまり、ジェネリック形式表現においてドット、ドットドット要素またはシンボリックリンクを持たない絶対パスです。
p
が絶対パスでない場合、関数は
std::
filesystem
::
absolute
(
p
)
によって最初に絶対パスに変換されたかのように動作します。パス
p
は存在している必要があります。
3,4)
存在する(
status
(
p
)
または
status
(
p, ec
)
によって決定される)
p
の先頭要素(存在する場合)と、続く
p
の存在しない要素から構成されるパス引数で
canonical()
を呼び出した結果から、
operator
/
=
によって構成されるパスを返す。結果のパスは
正規形式
である。
目次 |
パラメータ
| p | - |
絶対パスまたは相対パスを指定するパス;
canonical
の場合、既存のパスでなければならない
|
| ec | - | エラー状態を格納するエラーコード |
戻り値
1,2)
std::
filesystem
::
absolute
(
p
)
と同じファイルに解決される絶対パス。
3,4)
形式
canonical
(
x
)
/
y
の正規パス。ここで
x
は
p
内に存在する最長先頭要素シーケンスで構成されるパス、
y
は
p
の残りの末尾存在しない要素で構成されるパス。
例外
noexcept
でマークされていないオーバーロードは、
メモリ確保に失敗した場合
std::bad_alloc
をスローする可能性があります。
1,3)
基盤となるOS APIエラーに対して
std::filesystem::filesystem_error
をスローします。第一パス引数として
p
を、エラーコード引数としてOSエラーコードを使用して構築されます。
2,4)
設定する
std::
error_code
&
パラメータをOS APIエラーコードに(OS API呼び出しが失敗した場合)、そして実行する
ec.
clear
(
)
(エラーが発生しなかった場合)。
注記
canonical()
関数は、POSIXの
realpath
に基づいてモデル化されています。
weakly_canonical()
関数は、
relative()
の操作的意味論を簡素化するために導入されました。
例
このコードを実行
#include <filesystem> #include <iostream> int main() { /* サンドボックスディレクトリの設定: a └── b ├── c1 │ └── d <== カレントパス └── c2 └── e */ auto old = std::filesystem::current_path(); auto tmp = std::filesystem::temp_directory_path(); std::filesystem::current_path(tmp); auto d1 = tmp / "a/b/c1/d"; auto d2 = tmp / "a/b/c2/e"; std::filesystem::create_directories(d1); std::filesystem::create_directories(d2); std::filesystem::current_path(d1); auto p1 = std::filesystem::path("../../c2/./e"); auto p2 = std::filesystem::path("../no-such-file"); std::cout << "Current path is " << std::filesystem::current_path() << '\n' << "Canonical path for " << p1 << " is " << std::filesystem::canonical(p1) << '\n' << "Weakly canonical path for " << p2 << " is " << std::filesystem::weakly_canonical(p2) << '\n'; try { [[maybe_unused]] auto x_x = std::filesystem::canonical(p2); // 到達しない } catch (const std::exception& ex) { std::cout << "Canonical path for " << p2 << " threw exception:\n" << ex.what() << '\n'; } // クリーンアップ std::filesystem::current_path(old); const auto count = std::filesystem::remove_all(tmp / "a"); std::cout << "Deleted " << count << " files or directories.\n"; }
出力例:
Current path is "/tmp/a/b/c1/d" Canonical path for "../../c2/./e" is "/tmp/a/b/c2/e" Weakly canonical path for "../no-such-file" is "/tmp/a/b/c1/no-such-file" Canonical path for "../no-such-file" threw exception: filesystem error: in canonical: No such file or directory [../no-such-file] [/tmp/a/b/c1/d] Deleted 6 files or directories.
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2956 | C++17 |
canonical
に不要な
base
パラメータがある
|
削除 |
関連項目
|
(C++17)
|
パスを表現する
(クラス) |
|
(C++17)
|
絶対パスを構成する
(関数) |
|
(C++17)
|
相対パスを構成する
(関数) |