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

履歴 編集

function
<filesystem>

std::filesystem::recursive_directory_iterator::コンストラクタ(C++17)

recursive_directory_iterator() noexcept;                         // (1)
explicit recursive_directory_iterator(const path& p);            // (2)
recursive_directory_iterator(const path& p,
                   directory_options options);                   // (3)
recursive_directory_iterator(const path& p,
                   std::error_code& ec) noexcept;                // (4)
recursive_directory_iterator(const path& p,
                   directory_options options,
                   std::error_code& ec) noexcept;                // (5)
recursive_directory_iterator(const directory_iterator& rhs);     // (6)
recursive_directory_iterator(directory_iterator&& rhs) noexcept; // (7)

概要

recursive_directory_iteratorオブジェクトを構築する。

  • (1) : 終端イテレータを構築する
  • (2), (4) : 指定されたパスのディレクトリを再帰的に走査するイテレータを構築する
  • (3), (5) : 走査オプション付きで、指定されたパスのディレクトリを再帰的に走査するイテレータを構築する
  • (6) : コピーコンストラクタ
  • (7) : ムーブコンストラクタ

効果

  • (1) : 終端イテレータを構築する
  • (2), (4) : パスpがディレクトリに解決される場合、そのディレクトリの最初の要素を指すイテレータを構築する。パスpがディレクトリではない場合、終端イテレータを構築する
  • (3), (5) :
  • (6) : rhs*thisにコピーする。rhs*thisが同じオブジェクトである場合はなにもしない
  • (7) : rhsの所有権を*thisに移動する。rhs*thisが同じオブジェクトである場合はなにもしない

例外

  • (2), (3) : ファイルシステムがエラーを報告する場合がある。エラーが発生した場合は、std::filesystem::filesystem_error例外を送出する

備考

  • 現在のディレクトリを走査する場合は、recursive_directory_iterator("")ではなくrecursive_directory_iterator(".")を使用すること
  • このイテレータは、デフォルトではディレクトリのシンボリックリンクには従わない。ディレクトリのシンボリックリンクも再帰的に走査する場合は、走査オプションにdirectory_options::follow_directory_symlinkを指定すること

#include <cassert>
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;

int main()
{
  fs::create_directory("dir");
  std::ofstream{"dir/a.txt"};

  // (1) 終端イテレータを構築する
  {
    fs::recursive_directory_iterator it;
  }

  // (2) 指定したディレクトリの先頭要素を指すイテレータを構築する
  {
    fs::recursive_directory_iterator it{"dir"};
    assert(it->path() == "dir/a.txt");
  }

  // (3) 走査オプション付きで、指定したディレクトリの先頭要素を指すイテレータを構築する
  {
    fs::recursive_directory_iterator it{"dir", fs::directory_options::skip_permission_denied};
    assert(it->path() == "dir/a.txt");
  }

  // (4) エラー時 (アクセス拒否された場合) に例外ではなくerror_codeオブジェクトに書き込む
  {
    std::error_code ec;
    fs::recursive_directory_iterator it{"dir", ec};
    assert(!ec);
    assert(it->path() == "dir/a.txt");
  }

  // (5) 同上
  {
    std::error_code ec;
    fs::recursive_directory_iterator it{"dir", fs::directory_options::skip_permission_denied, ec};
    assert(!ec);
    assert(it->path() == "dir/a.txt");
  }
}

出力

バージョン

言語

  • C++17

処理系