- 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()
関数を使用する
- 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);
}
}
}
- 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
- Clang: 7.0 [mark verified]
- GCC: 8.1 [mark verified]
- Visual C++: