Namensräume
Varianten
Aktionen

std::filesystem::permissions

Von cppreference.com
 
 
 
Definiert in Header <filesystem>
void permissions( const std::filesystem::path& p,

                  std::filesystem::perms prms,

                  std::filesystem::perm_options opts = perm_options::replace );
(1) (seit C++17)
void permissions( const std::filesystem::path& p,

                  std::filesystem::perms prms,

                  std::error_code& ec ) noexcept;
(2) (seit C++17)
void permissions( const std::filesystem::path& p,

                  std::filesystem::perms prms,
                  std::filesystem::perm_options opts,

                  std::error_code& ec );
(3) (seit C++17)

Ändert die Zugriffsrechte der Datei, auf die p aufgelöst wird, als ob durch POSIX fchmodat. Symlinks werden verfolgt, es sei denn, perm_options::nofollow ist in opts gesetzt.

Die zweite Signatur verhält sich, als ob sie mit opts auf perm_options::replace gesetzt aufgerufen worden wäre.

Die Auswirkungen hängen wie folgt von prms und opts ab

  • Wenn opts perm_options::replace ist, werden die Dateirechte genau auf prms & std::filesystem::perms::mask gesetzt (d. h. jedes gültige Bit von prms wird angewendet).
  • Wenn opts perm_options::add ist, werden die Dateirechte genau auf status(p).permissions() | (prms & perms::mask) gesetzt (d. h. jedes gültige Bit, das in prms gesetzt ist, aber nicht in den aktuellen Dateirechten, wird zu den Dateirechten hinzugefügt).
  • Wenn opts perm_options::remove ist, werden die Dateirechte genau auf status(p).permissions() & ~(prms & perms::mask) gesetzt (d. h. jedes gültige Bit, das in prms gelöscht ist, aber in den aktuellen Dateirechten gesetzt ist, wird aus den Dateirechten gelöscht).

opts muss nur eines von replace, add oder remove gesetzt haben.

Die nicht werfende Überladung hat keine spezielle Aktion im Fehlerfall.

Inhalt

[edit] Parameter

p - Zu untersuchender Pfad
prms - zu setzende, hinzuzufügende oder zu entfernende Berechtigungen
opts - Optionen, die die von dieser Funktion ausgeführte Aktion steuern
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[edit] Rückgabewert

(keine)

[edit] Ausnahmen

Jede Überladung, die nicht als noexcept markiert ist, kann std::bad_alloc auslösen, wenn die Speicherzuweisung fehlschlägt.

1) Wirft std::filesystem::filesystem_error bei zugrundeliegenden Betriebssystem-API-Fehlern, konstruiert mit p als erstem Pfadargument und dem Betriebssystem-Fehlercode als Fehlercodeargument.
2,3) Setzt einen std::error_code& Parameter auf den Fehlercode der Betriebssystem-API, wenn ein Aufruf der Betriebssystem-API fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten.

[edit] Hinweise

Berechtigungen sind nicht notwendigerweise als Bits implementiert, werden aber konzeptionell so behandelt.

Einige Berechtigungsbits können auf einigen Systemen ignoriert werden, und das Ändern einiger Bits kann automatisch andere ändern (z. B. auf Plattformen ohne Unterscheidung zwischen Besitzer/Gruppe/andere, setzt das Setzen eines der drei Schreibbits alle drei).

[edit] Beispiel

#include <filesystem>
#include <fstream>
#include <iostream>
 
void demo_perms(std::filesystem::perms p)
{
    using std::filesystem::perms;
    auto show = [=](char op, perms perm)
    {
        std::cout << (perms::none == (perm & p) ? '-' : op);
    };
    show('r', perms::owner_read);
    show('w', perms::owner_write);
    show('x', perms::owner_exec);
    show('r', perms::group_read);
    show('w', perms::group_write);
    show('x', perms::group_exec);
    show('r', perms::others_read);
    show('w', perms::others_write);
    show('x', perms::others_exec);
    std::cout << '\n';
}
 
int main()
{
    std::ofstream("test.txt"); // create file
 
    std::cout << "Created file with permissions: ";
    demo_perms(std::filesystem::status("test.txt").permissions());
 
    std::filesystem::permissions(
        "test.txt",
        std::filesystem::perms::owner_all | std::filesystem::perms::group_all,
        std::filesystem::perm_options::add
    );
 
    std::cout << "After adding u+rwx and g+rwx:  ";
    demo_perms(std::filesystem::status("test.txt").permissions());
 
    std::filesystem::remove("test.txt");
}

Mögliche Ausgabe

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

[edit] Siehe auch

(C++17)
identifiziert Dateisystemberechtigungen
(Enum) [bearbeiten]
(C++17)(C++17)
ermittelt Dateiattribute
ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird
(Funktion) [bearbeiten]