• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <filesystem>

    std::filesystem::weakly_canonical

    namespace std::filesystem {
      path weakly_canonical(const path& p);                      // (1)
      path weakly_canonical(const path& p, std::error_code& ec); // (2)
    }
    

    概要

    パスを正規化する。

    この関数は、同じくパスの正規化をするcanonical()関数よりも、要件が弱い。この関数は、指定されたパスのファイルが存在していなくても、パスの正規化ができる。そのため、これから作るファイルの絶対パスを構築する、という用途に使用できる。

    効果

    パスpの部分パスのうち、存在してるところまでをcanonical関数に渡して正規化し、残った存在しない部分パスを後ろに結合して返す。

    パスpに含まれるいずれの部分パスも存在しない場合は、エラーとなる。エラーになった場合、(2)ではecにエラー情報が書き込まれる。

    戻り値

    シンボリックリンクを解決し、正規化された絶対パスが返る。

    (2)ではエラーとなった場合、path()が返る。

    例外

    • (1) : ファイルシステムがエラーを報告する場合がある。それに加えて、指定されたパスのいずれの部分パスも存在しない場合でもエラーである。エラーが発生した場合は、std::filesystem::filesystem_error例外を送出する
    • (2) : 仕様上は未規定だが、パスのメモリ確保で例外が発生する可能性がある

    #include <iostream>
    #include <filesystem>
    #include <fstream>
    
    namespace fs = std::filesystem;
    
    int main()
    {
      std::ofstream{"a.txt"};
      fs::create_directory("dir");
    
      // "." (ドットx1) を解決
      fs::path p1 = fs::weakly_canonical("./a.txt");
      std::cout << p1 << std::endl;
    
      // ".." (ドットx2) を解決
      fs::path p2 = fs::weakly_canonical("dir/../a.txt");
      std::cout << p2 << std::endl;
    
      // 存在しないファイルへの相対パス文字を解決
      fs::path p3 = fs::weakly_canonical("dir/../b.txt");
      std::cout << p3 << std::endl;
    }
    

    出力例

    "/home/my_app/a.txt"
    "/home/my_app/a.txt"
    "/home/my_app/b.txt"
    

    バージョン

    言語

    • C++17

    処理系

    参照