• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <filesystem>

    std::filesystem::path::append

    template <class Source>
    path& append(const Source& source);                    // (1)
    
    template <class InputIterator>
    path& append(InputIterator first, InputIterator last); // (2)
    

    概要

    パス要素を加算する。

    効果

    • (1) : return operator/=(path(source))と等価
    • (2) : return operator/=(path(first, last))と等価

    戻り値

    *this

    POSIXベースシステムでの例

    #include <iostream>
    #include <filesystem>
    
    namespace fs = std::filesystem;
    
    int main()
    {
      // 通常のユースケース
      // 後ろにディレクトリを加算する
      {
        fs::path p = "foo";
        p.append("bar");
        std::cout << "a : " << p << std::endl;
      }
    
      // 左辺の末尾にディレクトリ区切り文字が付いていてもよい
      {
        fs::path p = "foo/";
        p.append("bar");
        std::cout << "b : " << p << std::endl;
      }
    
      // 右辺が空のパスだった場合、ディレクトリ区切り文字だけ追加される
      {
        fs::path p = "foo";
        p.append("");
        std::cout << "c : " << p << std::endl;
      }
    
      // 右辺にルートディレクトリを含むパスを指定した場合、
      // 右辺を代入する動作となる
      {
        fs::path p = "foo";
        p.append("/bar");
        std::cout << "d : " << p << std::endl;
      }
    }
    

    出力

    a : "foo/bar"
    b : "foo/bar"
    c : "foo/"
    d : "/bar"
    

    Windowsでの例

    #include <iostream>
    #include <filesystem>
    
    namespace fs = std::filesystem;
    
    int main()
    {
      // 通常のユースケース
      // 後ろにディレクトリを加算する
      {
        fs::path p = "foo";
        p.append("bar");
        std::cout << "a : " << p << std::endl;
      }
    
      // 左辺の末尾にディレクトリ区切り文字が付いていてもよい
      {
        fs::path p = "C:/foo/";
        p.append("bar");
        std::cout << "b : " << p << std::endl;
      }
    
      // 右辺が空のパスだった場合、ディレクトリ区切り文字だけ追加される
      {
        fs::path p = "foo";
        p.append("");
        std::cout << "c : " << p << std::endl;
      }
    
      // 左辺がルート名を持っていて、ルートディレクトリを持たず、
      // 右辺が空の場合、ディレクトリ区切り文字は追加されない
      {
        fs::path p = "C:";
        p.append("");
        std::cout << "d : " << p << std::endl;
      }
    
      // 右辺にルート名を持つルートディレクトリを含むパスを指定した場合、
      // 右辺を代入する動作となる
      {
        fs::path p = "foo";
        p.append("C:/bar");
        std::cout << "e : " << p << std::endl;
      }
    
      // 右辺にルート名を持たないルートディレクトリを含むパスを指定した場合、
      // 左辺のルート名以外が右辺で上書きされる
      {
        fs::path p = "C:foo";
        p.append("/bar");
        std::cout << "f : " << p << std::endl;
      }
    
      // 左辺と右辺が同じルート名を持つ相対パスの場合、
      // 左辺のパスに、右辺のルート名を除く相対パス部分が加算される
      {
        fs::path p = "C:foo";
        p.append("C:bar");
        std::cout << "g : " << p << std::endl;
      }
    
      // 左辺と右辺が違うルート名を持つパスの場合、
      // 右辺を代入する動作となる
      {
        fs::path p = "C:foo";
        p.append("D:bar");
        std::cout << "h : " << p << std::endl;
      }
    }
    

    出力

    a : "foo\\bar"
    b : "C:/foo/bar"
    c : "foo\\"
    d : "C:"
    e : "C:/bar"
    f : "C:/bar"
    g : "C:foo\\bar"
    h : "D:bar"
    

    バージョン

    言語

    • C++17

    処理系

    備考