Namespaces
Variants

std::filesystem:: canonical, std::filesystem:: weakly_canonical

From cppreference.net
ヘッダーで定義 <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 / = によって構成されるパスを返す。結果のパスは 正規形式 である。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters、Return value、Exceptions、Notes、Example、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 数値や構造は完全に保持されています

パラメータ

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)
絶対パスを構成する
(関数)
相対パスを構成する
(関数)