# std::filesystem::perms

< cpp‎ | filesystem

定义于头文件 `<filesystem>` |  |
enum class perms; |  | (C++17 起)

此类型代表文件访问权限。 `perms` 满足位掩码类型 (BitmaskType) 的要求（表示位运算符 operator& 、 operator| 、 operator^ 、 operator~ 、 operator&= 、 operator|= 及 operator^= 对此类型定义）

访问权限模仿 POSIX 权限位，而且任何单独的文件权限（由 status 报告）都是下列位的某些组合：

### 成员常量

成员常量 | 值（八进制） | POSIX 等价 | 含义
--- | --- | --- | ---
`none` | ​0​ |  | 未设权限位
`owner_read` | 0400 | S_IRUSR | 文件拥有者拥有读权限
`owner_write` | 0200 | S_IWUSR | 文件拥有者拥有写权限
`owner_exec` | 0100 | S_IXUSR | 文件拥有着拥有执行/查找权限
`owner_all` | 0700 | S_IRWXU | 文件拥有者拥有读、写、执行/查找权限 等价于 owner_read | owner_write | owner_exec
`group_read` | 040 | S_IRGRP | 文件用户组拥有读权限
`group_write` | 020 | S_IWGRP | 文件用户组拥有写权限
`group_exec` | 010 | S_IXGRP | 文件用户组拥有执行/查找权限
`group_all` | 070 | S_IRWXG | 文件用户组拥有读、写、执行/查找权限 等价于 group_read | group_write | group_exec
`others_read` | 04 | S_IROTH | 其他用户拥有读权限
`others_write` | 02 | S_IWOTH | 其他用户拥有写权限
`others_exec` | 01 | S_IXOTH | 其他用户拥有执行/查找权限
`others_all` | 07 | S_IRWXO | 其他用户拥有拥有读、写及执行/查找权限 等价于 others_read | others_write | others_exec
`all` | 0777 |  | 所有用户拥有读、写及执行/查找权限 等价于 owner_all | group_all | others_all
`set_uid` | 04000 | S_ISUID | 在执行上设置用户 ID 为文件拥有者的用户 ID
`set_gid` | 02000 | S_ISGID | 在执行上设置组 ID 为文件用户的组 ID
`sticky_bit` | 01000 | S_ISVTX | 实现定义的含义，不过 POSIX XSI 指定在设置于目录时，唯有文件拥有者可以删除文件，即使该目录对其他人可写（与 /tmp 一并使用）
`mask` | 07777 |  | 所有合法权限位。 等价于 all | set_uid | set_gid | sticky_bit

另外，定义此类型的下列常量，它不表示权限：

成员常量 | 值（十六进制） | 含义
--- | --- | ---
`unknown` | 0xFFFF | 未知权限（例如当 file_status 以不带权限创建时）

### 注意

权限不必用位实现，但概念上用该方式处理它们。

某些系统上某些权限位可能被忽略，而更改某些位可能自动影响其他（例如在无拥有者/群/全体区别的平台上，设置三者任一部分都会写入三者全体的位集）

### 示例

    #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"); // 创建文件

        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--

### 参阅

status symlink_status (C++17)(C++17) | 确定文件属性 确定文件属性，检查符号链接目标 (函数)
permissions (C++17) | 修改文件访问权限 (函数)