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

履歴 編集

class
<filesystem>

std::filesystem::path(C++17)

namespace std::filesystem {
  class path;
}

概要

pathは、ファイルシステムのパスを表すクラスである。このクラスは、パスに関して以下のような機能を持つ:

  • パスの連結 ("a"もしくは"a/"ディレクトリと"b.txt"ファイル名を連結して"a/b.txt"パスとする)
  • パスに含まれるディレクトリ、ファイル名、拡張子などの抽出
  • 文字コード変換
  • パス区切り文字の変換
  • その他、文字列レベルのパス変換

このクラス自体は、ファイルシステムを操作しない。

メンバ関数

構築・破棄

名前 説明 対応バージョン
(constructor) コンストラクタ C++17
~path(); デストラクタ C++17
operator= 代入演算子 C++17
assign 代入 C++17

パスの加算・追加

名前 説明 対応バージョン
operator/= パス要素を加算する C++17
append パス要素を加算する C++17
operator+= パス文字列を加算する C++17
concat パス文字列を加算する C++17

パスの変更

名前 説明 対応バージョン
clear パスを空にする C++17
make_preferred ディレクトリの区切り文字を推奨する形式に変換する C++17
remove_filename パスからファイル名を除去する C++17
replace_filename パスに含まれるファイル名を置き換える C++17
replace_extension パスに含まれる拡張子を置き換える C++17
swap 他のpathオブジェクトとデータを入れ替える C++17

システムのパスフォーマット

名前 説明 対応バージョン
native システムの文字コードとしてパス文字列を取得する C++17
c_str システムの文字コードとしてC言語の文字列表現を取得する C++17
operator string_type システムの文字コードとして文字列型に変換する C++17
string システムのマルチバイト文字コードとしてパス文字列を取得する C++17
wstring システムのワイド文字コードとしてパス文字列を取得する C++17
u8string UTF-8エンコードとしてパス文字列を取得する C++17
u16string UTF-16エンコードでパス文字列を取得する C++17
u32string UTF-32エンコードでパス文字列を首都する C++17

システム非依存のパスフォーマット

名前 説明 対応バージョン
generic_string システムのマルチバイト文字コードとして、環境非依存パスフォーマットのパス文字列を取得する C++17
generic_wstring システムのワイド文字コードとして、環境非依存パスフォーマットのパス文字列を取得する C++17
generic_u8string UTF-8エンコードで、環境非依存パスフォーマットのパス文字列を取得する C++17
generic_u16string UTF-16エンコードで、環境非依存パスフォーマットのパス文字列を取得する C++17
generic_u32string UTF-32エンコードで、環境非依存パスフォーマットのパス文字列を取得する C++17

比較

名前 説明 対応バージョン
compare 他のパスと文字列レベルで比較する C++17

抽出

名前 説明 対応バージョン
root_name ルート名を取得する C++17
root_directory ルートディレクトリを取得する C++17
root_path ルートパスを取得する C++17
relative_path ルートパスからの相対パスを取得する C++17
parent_path 親のパスを取得する C++17
filename ファイル名を取得する C++17
stem 拡張子を除いたファイル名を取得する C++17
extension 拡張子を取得する C++17

パス情報の判定

名前 説明 対応バージョン
empty パスが空か判定する C++17
has_root_name ルート名が含まれているか判定する C++17
has_root_directory ルートディレクトリが含まれているか判定する C++17
has_root_path ルートパスが含まれているか判定する C++17
has_relative_path ルートパスからの相対パスが含まれているか判定する C++17
has_parent_path 親のパスが含まれているか判定する C++17
has_filename ファイル名が含まれているか判定する C++17
has_stem 拡張子を除いたファイル名が含まれているか判定する C++17
has_extension 拡張子が含まれているか判定する C++17
is_absolute 絶対パスかを判定する C++17
is_relative 相対パスかを判定する C++17

文字列レベルのパス生成

名前 説明 対応バージョン
lexically_normal 文字列レベルで正規化する C++17
lexically_relative 文字列レベルで相対パスに変換する C++17
lexically_proximate 文字列レベルで相対パスに変換する C++17

イテレータ

名前 説明 対応バージョン
begin ディレクトリ区切りした各パス要素のうち、先頭要素を指すイテレータを取得する C++17
end ディレクトリ区切りした各パス要素のうち、末尾要素の次を指すイテレータを取得する C++17

メンバ型

名前 説明 対応バージョン
value_type パスを表現するシステム依存のエンコード文字型。
POSIXベースのシステムではchar
Windowsベースのシステムではwchar_t
C++17
string_type パス文字列型 basic_string<value_type> C++17
format パスフォーマットの列挙型 C++17
iterator ディレクトリ区切りの要素を走査するイテレータ C++17
const_iterator iteratorの別名 C++17

メンバ定数

名前 説明 対応バージョン
static constexpr value_type preferred_separator 推奨するディレクトリ区切り文字。
POSIXベースのシステムではスラッシュ ('/')
Windowsベースのシステムではバックスラッシュ (L'\\')
C++17

非メンバ関数

一般関数

名前 説明 対応バージョン
swap 2つのpathオブジェクトを入れ替える C++17
hash_value パスのハッシュ値を取得する C++17

比較演算子

名前 説明 対応バージョン
operator== 等値比較 C++17
operator!= 非等値比較 C++17
operator< 左辺が右辺より小さいかの判定を行う C++17
operator<= 左辺が右辺以下かの判定を行う C++17
operator> 左辺が右辺より大きいかの判定を行う C++17
operator>= 左辺が右辺以上かの判定を行う C++17

パスの連結

名前 説明 対応バージョン
operator/ 2つのパスを連結する C++17

入出力

名前 説明 対応バージョン
operator<< ストリームへの出力 C++17
operator>> ストリームからの入力 C++17

生成関数

名前 説明 対応バージョン
u8path UTF-8エンコードされた文字列からパスオブジェクトを構築する C++17

POSIXベースシステムの例

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
  fs::path p = "/a/b/c.txt";

  // パスから、ファイル名を除いたディレクトリ、ファイル名、
  // 拡張子を除いたファイル名、拡張子を抽出
  std::cout << "directory : " << p.parent_path() << std::endl;
  std::cout << "filename  : " << p.filename() << std::endl;
  std::cout << "stem      : " << p.stem() << std::endl;
  std::cout << "extension : " << p.extension() << std::endl;

  // パスが絶対パスか相対パスか判定
  if (p.is_absolute()) {
    std::cout << p << "は絶対パス" << std::endl;
  }
  else {
    std::cout << p << "は相対パス" << std::endl;
  }
}

出力

directory : "/a/b"
filename  : "c.txt"
stem      : "c"
extension : ".txt"
"/a/b/c.txt"は絶対パス

Windowsの例

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
  fs::path p = "C:/a\\b/c.txt";

  // パスから、ファイル名を除いたディレクトリ、ファイル名、
  // 拡張子を除いたファイル名、拡張子を抽出
  std::cout << "directory : " << p.parent_path() << std::endl;
  std::cout << "filename  : " << p.filename() << std::endl;
  std::cout << "stem      : " << p.stem() << std::endl;
  std::cout << "extension : " << p.extension() << std::endl;

  // システム依存のパスフォーマットと、システム非依存のパスフォーマット
  std::cout << "native format  : " << p.native() << std::endl;
  std::cout << "generic format : " << p.generic_string() << std::endl;

  // パスが絶対パスか相対パスか判定
  if (p.is_absolute()) {
    std::cout << p << "は絶対パス" << std::endl;
  }
  else {
    std::cout << p << "は相対パス" << std::endl;
  }
}

出力

directory : "C:\a\b"
filename  : "c.txt"
stem      : "c"
extension : ".txt"
native format  : C:\a\b\c.txt
generic format : C:/a/b/c.txt
"C:\a\b\c.txt"は絶対パス

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

バージョン

言語

  • C++17

処理系