std::filesystem::create_directory, std::filesystem::create_directories
Von cppreference.com
< cpp | filesystem
| 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, |
(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.Auf Windows-Betriebssystemen werden keine Attribute von existing_p kopiert.
stat(existing_p.c_str(), &attributes_stat) mkdir(p.c_str(), attributes_stat.st_mode)
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
Führen Sie diesen Code aus
#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
| (C++17)(C++17) |
erstellt einen symbolischen Link (Funktion) |
| (C++17) |
kopiert Dateien oder Verzeichnisse (Funktion) |
| (C++17) |
identifiziert Dateisystemberechtigungen (Enum) |