Namespaces
Variants

std::filesystem:: create_directory, std::filesystem:: create_directories

From cppreference.net
Definiert im Header <filesystem>
bool create_directory ( const std:: filesystem :: path & p ) ;
(1) (seit C++17)
bool create_directory ( const std:: filesystem :: path & p, std:: error_code & ec ) noexcept ;
(2) (seit C++17)
bool create_directory ( const std:: filesystem :: path & p,
const std:: filesystem :: path & existing_p ) ;
(3) (seit C++17)
bool create_directory ( const std:: filesystem :: path & p,

const std:: filesystem :: path & existing_p,

std:: error_code & ec ) noexcept ;
(4) (seit C++17)
bool create_directories ( const std:: filesystem :: path & p ) ;
(5) (seit C++17)
bool create_directories ( const std:: filesystem :: path & p, std:: error_code & ec ) ;
(6) (seit C++17)
1,2) Erstellt das Verzeichnis p wie durch POSIX mkdir() mit einem zweiten Argument von static_cast < int > ( std:: filesystem :: perms :: all ) (das übergeordnete Verzeichnis muss bereits existieren). Falls die Funktion fehlschlägt, weil p auf ein existierendes Verzeichnis verweist, wird kein Fehler gemeldet. Andernfalls wird bei einem Fehler eine Fehlermeldung ausgegeben.
3,4) Gleich wie (1,2) , mit der Ausnahme, dass die Attribute des neuen Verzeichnisses von existing_p kopiert werden (welches ein existierendes Verzeichnis sein muss). Es ist betriebssystemabhängig, welche Attribute kopiert werden: Auf POSIX-Systemen werden die Attribute kopiert wie durch
stat(existing_p.c_str(), &attributes_stat)
mkdir(p.c_str(), attributes_stat.st_mode)
Auf Windows-Betriebssystemen werden keine Attribute von existing_p kopiert.
5,6) Führt (1,2) für jedes Element von p aus, das noch nicht existiert. Wenn p bereits existiert, führt die Funktion nichts aus (dieser Zustand wird nicht als Fehler behandelt).

Inhaltsverzeichnis

Parameter

p - der Pfad zum neuen zu erstellenden Verzeichnis
existing_p - der Pfad zu einem Verzeichnis, von dem die Attribute kopiert werden sollen
ec - Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung

Rückgabewert

true wenn ein Verzeichnis neu erstellt wurde für das Verzeichnis, auf das p verweist, false andernfalls.

Ausnahmen

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

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

Hinweise

Die attributerhaltende Überladung (3,4) wird implizit von copy() aufgerufen, wenn Verzeichnisse rekursiv kopiert werden. Ihr Äquivalent in boost.filesystem ist copy_directory (mit umgekehrter Argumentreihenfolge).

Beispiel

#include <cassert>
#include <cstdlib>
#include <filesystem>
int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());
    // Grundlegende Verwendung
    std::filesystem::create_directories("sandbox/1/2/a");
    std::filesystem::create_directory("sandbox/1/2/b");
    // Verzeichnis existiert bereits (false zurückgegeben, kein Fehler)
    assert(!std::filesystem::create_directory("sandbox/1/2/b"));
    // Verwendung der Berechtigungskopie
    std::filesystem::permissions(
        "sandbox/1/2/b",
        std::filesystem::perms::others_all,
        std::filesystem::perm_options::remove
    );
    std::filesystem::create_directory("sandbox/1/2/c", "sandbox/1/2/b");
    std::system("ls -l sandbox/1/2");
    std::system("tree sandbox");
    std::filesystem::remove_all("sandbox");
}

Mögliche Ausgabe:

drwxr-xr-x 2 user group 4096 Apr 15 09:33 a
drwxr-x--- 2 user group 4096 Apr 15 09:33 b
drwxr-x--- 2 user group 4096 Apr 15 09:33 c
sandbox
└── 1
    └── 2
        ├── a
        ├── b
        └── c

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2935 C++17 Fehler, falls Ziel bereits existiert, aber kein Verzeichnis ist kein Fehler
LWG 3014 C++17 error_code Überladung von create_directories als noexcept markiert, kann aber Speicher allozieren noexcept entfernt
P1164R1 C++17 Erstellungsfehler verursacht durch existierende Nicht-Verzeichnis-Datei ist kein Fehler als Fehler festgelegt

Siehe auch

erstellt eine symbolische Verknüpfung
(Funktion)
(C++17)
kopiert Dateien oder Verzeichnisse
(Funktion)
(C++17)
identifiziert Dateisystem-Berechtigungen
(Enumeration)