Namensräume
Varianten
Aktionen

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

Von cppreference.com
 
 
 
Definiert in 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, als ob durch POSIX mkdir() mit einem zweiten Argument von static_cast<int>(std::filesystem::perms::all) (das übergeordnete Verzeichnis muss bereits existieren). Wenn die Funktion fehlschlägt, weil p zu einem existierenden Verzeichnis aufgelöst wird, wird kein Fehler gemeldet. Andernfalls wird bei einem Fehler ein Fehler gemeldet.
3,4) Wie (1,2), außer 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 wie durch kopiert.
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, tut die Funktion nichts (dieser Zustand wird nicht als Fehler behandelt).

Inhalt

[edit] Parameter

p - der Pfad zum neu zu erstellenden Verzeichnis
existing_p - der Pfad zu einem Verzeichnis, von dem die Attribute kopiert werden sollen
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[edit] Rückgabewert

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

[edit] Ausnahmen

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

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

[edit] Hinweise

Die Attribut-erhaltende Überladung (3,4) wird implizit von copy() beim rekursiven Kopieren von Verzeichnissen aufgerufen. Ihr Äquivalent in boost.filesystem ist copy_directory (mit vertauschter Argumentreihenfolge).

[edit] Beispiel

#include <cassert>
#include <cstdlib>
#include <filesystem>
 
int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());
 
    // Basic usage
    std::filesystem::create_directories("sandbox/1/2/a");
    std::filesystem::create_directory("sandbox/1/2/b");
 
    // Directory already exists (false returned, no error)
    assert(!std::filesystem::create_directory("sandbox/1/2/b"));
 
    // Permissions copying usage
    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

[edit] Fehlerberichte

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2935 C++17 Fehler, wenn das 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 zuweisen noexcept entfernt
P1164R1 C++17 Erstellungsfehler, der durch eine existierende Nicht-Verzeichnis-Datei verursacht wird, ist kein Fehler Fehler gemacht

[edit] Siehe auch

erstellt einen symbolischen Link
(Funktion) [bearbeiten]
(C++17)
kopiert Dateien oder Verzeichnisse
(Funktion) [bearbeiten]
(C++17)
identifiziert Dateisystemberechtigungen
(Enum) [bearbeiten]