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

履歴 編集

function
<filesystem>

std::filesystem::path::operator/=(C++17)

path& operator/=(const path& p);        // (1)

template <class Source>
path& operator/=(const Source& source); // (2)

概要

パス要素を加算する。

効果

  • (1) :
    • p.is_absolute() || (p.has_root_name() && p.[root_name()](root_name.md)!=[root_name()](root_name.md))であれば、p*this`に代入する。
      • pが絶対パスであれば*thisにパス連結できないため、置き換えとする
    • そうでなければ、*thisを以下のように変更する:
      1. pルートディレクトリを持っている場合、*thisからルートディレクトリ相対パスを削除する
      2. pがルートディレクトリを持っておらず、絶対パスである、もしくはファイル名を持っている場合、環境推奨のディレクトリ区切り文字を*thisに追加する
      3. ルート名を除いたp*thisに追加する
  • (2) :
    • return operator/=(path(source))と同等

戻り値

*this

POSIXベースシステムでの例

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
  // 通常のユースケース
  // 後ろにディレクトリを加算する
  {
    fs::path p = "foo";
    p /= "bar";
    std::cout << "a : " << p << std::endl;
  }

  // 左辺の末尾にディレクトリ区切り文字が付いていてもよい
  {
    fs::path p = "foo/";
    p /= "bar";
    std::cout << "b : " << p << std::endl;
  }

  // 右辺が空のパスだった場合、ディレクトリ区切り文字だけ追加される
  {
    fs::path p = "foo";
    p /= "";
    std::cout << "c : " << p << std::endl;
  }

  // 右辺にルートディレクトリを含むパスを指定した場合、
  // 右辺を代入する動作となる
  {
    fs::path p = "foo";
    p /= "/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 /= "bar";
    std::cout << "a : " << p << std::endl;
  }

  // 左辺の末尾にディレクトリ区切り文字が付いていてもよい
  {
    fs::path p = "C:/foo/";
    p /= "bar";
    std::cout << "b : " << p << std::endl;
  }

  // 右辺が空のパスだった場合、ディレクトリ区切り文字だけ追加される
  {
    fs::path p = "foo";
    p /= "";
    std::cout << "c : " << p << std::endl;
  }

  // 左辺がルート名を持っていて、ルートディレクトリを持たず、
  // 右辺が空の場合、ディレクトリ区切り文字は追加されない
  {
    fs::path p = "C:";
    p /= "";
    std::cout << "d : " << p << std::endl;
  }

  // 右辺にルートディレクトリを含むパスを指定した場合、
  // 右辺を代入する動作となる
  {
    fs::path p = "foo";
    p /= "C:/bar";
    std::cout << "d : " << p << std::endl;
  }

  // 左辺と右辺のディレクトリ区切り文字の有無に関わらず連結される
  // (POSIXと違って、ルートディレクトリが`/`ではないため、
  //  右辺の開始をディレクトリ区切り文字にできる)
  {
    fs::path p = "foo";
    p /= "/bar";
    std::cout << "e : " << p << std::endl;
  }

  // 左辺がルート名を持ち、ルートディレクトリを持たないパスで、
  // 右辺に空のパスを指定した場合、ディレクトリ区切り文字は追加されない
  {
    fs::path p = "C:";
    p /= "";
    std::cout << "f : " << p << std::endl;
  }

  // 左辺がカレントディレクトリに依存した絶対パスの場合、
  // 相対パスを追加するとカレントディレクトリに依存したパス部分が右辺で上書きされる
  {
    fs::path p = "C:foo";
    p /= "/bar";
    std::cout << "g : " << p << std::endl;
  }

  // 左辺がカレントディレクトリに依存した絶対パスで、
  // 右辺もカレントディレクトリに依存した絶対パスの場合、
  // 左辺のパスに、右辺のカレントディレクトリに依存した部分が加算される
  {
    fs::path p = "C:foo";
    p /= "C:bar";
    std::cout << "h : " << p << std::endl;
  }
}

出力

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

Windowsでの例は、Visual C++が正式にファイルシステムライブラリをサポートしていないことから、未検証のサンプルコード・出力となっている。

バージョン

言語

  • C++17

処理系

備考