namespace std::filesystem {
void permissions(const path& p, perms prms, perm_options opts=perm_options::replace); // (1)
void permissions(const path& p, perms prms, std::error_code& ec) noexcept; // (2)
void permissions(const path& p, perms prms, perm_options opts, std::error_code& ec); // (3)
}
概要
ファイルの権限を設定する。
効果
optsで指定されたアクションを、パスpが解決するファイルに対して適用する。ただし、pがシンボリックリンクであり、かつoptsにperm_options::nofollowが設定されている場合は、シンボリックリンク自体に対して適用する。
- POSIX環境では、
fchmodat()関数を使用して権限を設定する - (2) は、権限オプションとして
perm_options::replaceが使用される
戻り値
なし
例外
- (1), (3) : ファイルシステムがエラーを報告する場合がある。エラーが発生した場合は、
std::filesystem::filesystem_error例外を送出する- (3) は狭い契約(
optsにperm_optionsのreplace・add・removeのうち正確に1つが含まれること)を持つためnoexceptではない
- (3) は狭い契約(
- (2) : 投げない
例
#include <cassert>
#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;
int main()
{
std::ofstream{"regular.txt"};
// regular.txtファイルの権限を、owner_all (0700) に変更する
fs::permissions("regular.txt", fs::perms::owner_all);
}
出力
バージョン
言語
- C++17
処理系
- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++:
関連項目
参照
- LWG Issue 2719.
permissionsfunction should not benoexceptdue to narrow contract- C++17の策定中に、狭い契約(
optsにperm_optionsのreplace・add・removeのうち正確に1つが含まれること)を持つため、perm_optionsとerror_codeを取る版(3)からnoexceptが外された
- C++17の策定中に、狭い契約(
- LWG Issue 2720.
permissionsfunction incorrectly specified for symlinks- C++17の策定中に、シンボリックリンク自体を対象とするか解決先を対象とするかを制御する方向へ整理された(本issue自体は
perms::resolve_symlinksをperms::symlink_nofollowへ置き換えるもので、最終的なC++17ではP0492R2によりperm_options::nofollowとなった)
- C++17の策定中に、シンボリックリンク自体を対象とするか解決先を対象とするかを制御する方向へ整理された(本issue自体は