Skip to content

Latest commit

 

History

History
120 lines (99 loc) · 4.57 KB

symlink_status.md

File metadata and controls

120 lines (99 loc) · 4.57 KB

symlink_status

  • filesystem[meta header]
  • std::filesystem[meta namespace]
  • function[meta id-type]
  • cpp17[meta cpp]
namespace std::filesystem {
  file_status symlink_status(const path& p);                          // (1)
  file_status symlink_status(const path& p, error_code& ec) noexcept; // (2)
}
  • path[link path.md]
  • file_status[link file_status.md]
  • error_code[link /reference/system_error/error_code.md]

概要

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

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;
  • error_code[link /reference/system_error/error_code.md]
  • file_status[link file_status.md]
  • result.type()[link file_status/type.md]
  • file_type[link file_type.md]
  • filesystem_error[link filesystem_error.md]
  • (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);
    }
  }
}
  • fs::symlink_status[color ff0000]
  • fs::create_symlink[link create_symlink.md]
  • fs::file_status[link file_status.md]
  • status.type()[link file_status/type.md]
  • status.permissions()[link file_status/permissions.md]
  • fs::file_type[link file_type.md]
  • fs::perms[link perms.md]

出力

バージョン

言語

  • C++17

処理系