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()
関数を使用する
- POSIX環境であれば
- OSのファイルシステムAPIによってエラーが報告された場合、
ec
にエラー情報が設定される。そうでなければ、ec.clear()
を呼び出し、エラー情報をクリアする
- 可能なら、ファイルパス
戻り値
- (1) : ファイルパス
p
が指すファイルの状態を返す - (2) :
ec
にエラー情報が設定された場合、- ファイルパス
p
が見つからなかった場合、file_status{file_type::not_found, perms::unknown}
が返る - ファイルパス
p
は見つかったが属性を決定できなかった場合、file_status{file_type::unknown, perms::unknown}
が返る - そのいずれでもなければ、
file_status{file_type::none, perms::unknown}
が返る
- ファイルパス
- 正常にファイル属性を取得できた場合、シンボリックリンク以外のファイルに対しては、そのファイル種別とファイル権限。シンボリックリンクに対しては、ファイル種別として
file_type::symlink
と、ファイル権限が設定されたfile_status
オブジェクトが返る
例外
- (1) : ファイルが見つからない場合、
std::filesystem::filesystem_error
例外を送出する - (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
処理系
- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++: