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

履歴 編集

function
<filesystem>

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

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

概要

シンボリックリンクの状態を取得する。

std::filesystem::status()関数にシンボリックリンクのパスを指定した場合、シンボリックリンクが指すファイルの状態を取得するが、この関数はリンク自体の状態を取得する。シンボリックリンク以外のファイルに対しては、std::filesystem::status()関数と同じ動作をする。

効果

  • (1) : 以下を行う:

error_code ec;
file_status result = symlink_status(p, ec);
if (result.type() == file_type::none)
    throw filesystem_error(実装定義のメッセージ, p, ec);

return result;

  • (2) :
    • 可能なら、ファイルパスpが指すファイルの属性を決定する。シンボリックリンクに対しては、シンボリックリンクが指すファイルではなく、シンボリックリンク自体のファイル属性を決定する
      • POSIX環境であればlstat()関数を使用する
    • OSのファイルシステムAPIによってエラーが報告された場合、ecにエラー情報が設定される。そうでなければ、ec.clear()を呼び出し、エラー情報をクリアする

戻り値

  • (1) : ファイルパスpが指すファイルの状態を返す
  • (2) :

例外

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

namespace fs = std::filesystem;

int main()
{
  std::ofstream{"a.txt"};
  fs::create_symlink("a_symlink.txt", "a.txt");

  // (1)
  {
    try {
      fs::file_status status = fs::symlink_status("a_symlink.txt");
      assert(status.type() == fs::file_type::symlink);
      assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
    }
    catch (fs::filesystem_error& fe) {
      std::cout << fe.what() << std::endl;
    }
  }

  // (2)
  {
    std::error_code ec;
    fs::file_status status = fs::symlink_status("a_symlink.txt", ec);
    if (ec) {
      std::cout << ec.message() << std::endl;
    }
    else {
      assert(status.type() == fs::file_type::symlink);
      assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
    }
  }
}

出力

バージョン

言語

  • C++17

処理系