namespace std::filesystem {
file_status status(const path& p); // (1)
file_status status(const path& p, error_code& ec) noexcept; // (2)
}
概要
ファイル状態を取得する。
パスがシンボリックリンクを指している場合、シンボリックリンクが指すファイルの状態を取得する。シンボリックリンク自体の状態を取得する場合は、std::filesystem::symlink_status()
関数を使用すること。
効果
- (1) : 以下を行う:
error_code ec;
file_status result = status(p, ec);
if (result.type() == file_type::none)
throw filesystem_error(実装定義のメッセージ, p, ec);
return result;
- (2) :
- 可能なら、ファイルパス
p
が指すファイルの属性を決定する- POSIX環境であれば
stat()
関数を使用する
- 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_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"};
// (1)
{
try {
fs::file_status status = fs::status("a.txt");
assert(status.type() == fs::file_type::regular);
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::status("a.txt", ec);
if (ec) {
std::cout << ec.message() << std::endl;
}
else {
assert(status.type() == fs::file_type::regular);
assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
}
}
}
37
#include <iostream>
#include <cassert>
#include <fstream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::ofstream{"a.txt"};
// (1)
{
try {
fs::file_status status = fs::status("a.txt");
assert(status.type() == fs::file_type::regular);
assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
}
出力
バージョン
言語
- C++17
処理系
- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++: