名前空間
変種
操作

std::filesystem::permissions

提供: cppreference.com
 
 
 
ヘッダ <filesystem> で定義
void permissions(const std::filesystem::path& p,

                 std::filesystem::perms prms,
                 std::filesystem::perm_options opts = perm_options::replace);
void permissions(const std::filesystem::path& p,
                 std::filesystem::perms prms,
                 std::error_code& ec) noexcept;
void permissions(const std::filesystem::path& p,
                 std::filesystem::perms prms,
                 std::filesystem::perm_options opts,

                 std::error_code& ec);
(C++17以上)

POSIX の fchmodat によって行われたかのように、 p の解決先のファイルのアクセスパーミッションを変更します。 optsperm_options::nofollow が設定されていなければ、シンボリックリンクを辿ります。

2番目のシグネチャは、 optsperm_options::replace を設定して呼ばれたかのように振る舞います。

効果は prmsopts によって以下のようになります。

  • optsperm_options::replace であれば、ファイルパーミッションは正確に prms & std::filesystem::perms::mask に設定されます (つまり、 prms のすべての有効なビットが適用されます)。
  • optsperm_options::add であれば、ファイルパーミッションは正確に status(p).permissions() | (prms & perms::mask) に設定されます (つまり、 prms に設定されているけれどもファイルの現在のパーミッションにはないあらゆる有効なビットが、ファイルのパーミッションに追加されます)。
  • optsperm_options::remove であれば、ファイルパーミッションは正確に status(p).permissions() & ~(prms & perms::mask) に設定されます (つまり、 prms ではクリアされているけれどもファイルの現在のパーミッションには設定されているあらゆる有効なビットが、ファイルのパーミッションからクリアされます)。

optsreplaceadd、または remove のいずれかひとつだけが設定されていなければなりません。

例外を投げないオーバーロードは、エラーが発生した場合、何も特別なアクションをしません。

目次

[編集] 引数

p - 調べるパス
prms - 設定、追加、または削除するパーミッション
opts - この関数が取るアクションを制御するオプション
ec - 例外を投げないオーバーロードでエラーを報告するための出力引数

[編集] 戻り値

(なし)

[編集] 例外

std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に p、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept 指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。

[編集] ノート

パーミッションは、ビットとして実装されている必要はありませんが、概念的にはそのように取り扱われます。

システムによっては、いくつかのパーミッションビットは無視されるかもしれませんし、いくつかのビットは自動的に他のビットを変更するかもしれません (例えば、オーナー/グループ/全員の区別を持たないプラットフォームでは、3つの書き込みビットのいずれかを設定するだけで、3つ全部が設定されます)。

[編集]

#include <fstream>
#include <bitset>
#include <iostream>
#include <filesystem>
namespace fs = std::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"); // create file
 
    std::cout << "Created file with permissions: ";
    demo_perms(fs::status("test.txt").permissions());
 
    fs::permissions("test.txt",
                    fs::perms::owner_all | fs::perms::group_all,
                    fs::perm_options::add);
 
    std::cout << "After adding o+rwx and 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+wrx:  rwxrwxr--

[編集] 関連項目

(C++17)
ファイルシステムのパーミッションを表します
(列挙) [edit]
(C++17)(C++17)
ファイルの属性を調べます
シンボリックリンクのターゲットを確認しながらファイルの属性を調べます
(関数) [edit]