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

Примечания

Разрешения могут быть реализованы не обязательно в виде битов, но концептуально они рассматриваются именно так.

Некоторые биты разрешений могут игнорироваться в некоторых системах, и изменение некоторых битов может автоматически изменять другие (например, на платформах без разграничения владелец/группа/все, установка любого из трех битов записи устанавливает все три).

Пример

#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");
}

Возможный вывод:

Создан файл с правами доступа: rw-r--r--
После добавления o+rwx и g+rwx:  rwxrwxr--

Смотрите также

определяет права доступа файловой системы
(перечисление)
определяет атрибуты файла
определяет атрибуты файла, проверяя цель символьной ссылки
(функция)