Namespaces
Variants

std::experimental::filesystem:: permissions

From cppreference.net
ヘッダーで定義 <experimental/filesystem>
void permissions ( const path & p, perms prms ) ;
void permissions ( const path & p, perms prms, error_code & ec ) ;
(filesystem TS)

p が解決するファイルのアクセス権限を変更します。POSIXの fchmodat と同様の動作をします。 prms::resolve_symlinks が設定されている場合、シンボリックリンクは追従されます。

効果は以下のように prms に依存します:

  • perms :: add_perms perms :: remove_perms も設定されていない場合、ファイルのパーミッションは正確に prms & fs :: perms :: mask に設定されます(つまり、 prms のすべての有効なビットが適用されます)。
  • perms :: add_perms が設定されている場合、ファイルのパーミッションは正確に status ( p ) . permissions ( ) | ( prms & perms :: mask ) に設定されます(つまり、 prms で設定されているがファイルの現在のパーミッションには設定されていない有効なビットが、ファイルのパーミッションに追加されます)。
  • perms :: remove_perms が設定されている場合、ファイルのパーミッションは正確に status ( p ) . permissions ( ) & ~ ( prms & perms :: mask ) に設定されます(つまり、 prms でクリアされているがファイルの現在のパーミッションには設定されている有効なビットが、ファイルのパーミッションからクリアされます)。
  • perms :: add_perms perms :: remove_perms の両方が設定されている場合、エラーが発生します。

例外を投げないオーバーロードは、エラー時に特別な動作を行いません。

目次

パラメータ

p - 検査対象のパス
prms - 設定・追加・削除するパーミッション
ec - 例外を送出しないオーバーロードでのエラー報告用出力パラメータ

戻り値

(なし)

例外

The overload that does not take an error_code & parameter throws filesystem_error on underlying OS API errors, constructed with p as the first argument and the OS error code as the error code argument. std:: bad_alloc may be thrown if memory allocation fails. The overload taking an error_code & parameter sets it to the OS API error code if an OS API call fails, and executes ec. clear ( ) if no errors occur. This overload has
noexcept 仕様:
noexcept

注記

権限は必ずしもビットとして実装されるわけではありませんが、概念的にはそのように扱われます。

一部のパーミッションビットは一部のシステムで無視される可能性があり、一部のビットを変更すると自動的に他のビットが変更される場合があります(例:所有者/グループ/全ユーザーの区別がないプラットフォームでは、3つの書き込みビットのいずれかを設定すると、3つすべてが設定されます)。

#include <bitset>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::filesystem;
void demo_perms(fs::perms p)
{
     std::cout << ((p & fs::perms::owner_read) != fs::perms::none ? "r" : "-")
               << ((p & fs::perms::owner_write) != fs::perms::none ? "w" : "-")
               << ((p & fs::perms::owner_exec) != fs::perms::none ? "x" : "-")
               << ((p & fs::perms::group_read) != fs::perms::none ? "r" : "-")
               << ((p & fs::perms::group_write) != fs::perms::none ? "w" : "-")
               << ((p & fs::perms::group_exec) != fs::perms::none ? "x" : "-")
               << ((p & fs::perms::others_read) != fs::perms::none ? "r" : "-")
               << ((p & fs::perms::others_write) != fs::perms::none ? "w" : "-")
               << ((p & fs::perms::others_exec) != fs::perms::none ? "x" : "-")
               << '\n';
}
int main()
{
    std::ofstream("test.txt"); // ファイル作成
    std::cout << "作成されたファイルのパーミッション: ";
    demo_perms(fs::status("test.txt").permissions());
    fs::permissions("test.txt", fs::perms::add_perms |
                                fs::perms::owner_all | fs::perms::group_all);
    std::cout << "o+rwx と g+rwx を追加後:  ";
    demo_perms(fs::status("test.txt").permissions());
    fs::remove("test.txt");
}

出力例:

Created file with permissions: rw-r--r--
After adding o+rwx and g+rwx:  rwxrwxr--

関連項目

ファイルシステムのパーミッションを識別する
(列挙型)
ファイル属性を決定する
シンボリックリンクのターゲットをチェックしてファイル属性を決定する
(関数)