std::filesystem::rename
Von cppreference.com
< cpp | filesystem
| Definiert in Header <filesystem> |
||
| void rename( const std::filesystem::path& old_p, const std::filesystem::path& new_p ); |
(1) | (seit C++17) |
| void rename( const std::filesystem::path& old_p, const std::filesystem::path& new_p, |
(2) | (seit C++17) |
Verschiebt oder benennt das Dateisystemobjekt, das durch old_p identifiziert wird, nach new_p um, als ob dies durch den POSIX rename-Aufruf geschehen wäre.
- Wenn old_p eine Nicht-Verzeichnis-Datei ist, muss new_p eine der folgenden Bedingungen erfüllen:
- dasselbe Datei wie old_p oder ein Hardlink dazu: In diesem Fall wird nichts unternommen.
- eine existierende Nicht-Verzeichnis-Datei: new_p wird zuerst gelöscht. Dann, ohne dass andere Prozesse new_p als gelöscht wahrnehmen können, wird der Pfadname new_p mit der Datei verknüpft und old_p von der Datei getrennt. Schreibberechtigungen sind sowohl für das Verzeichnis erforderlich, das old_p enthält, als auch für das Verzeichnis, das new_p enthält.
- eine nicht existierende Datei in einem existierenden Verzeichnis: Der Pfadname new_p wird mit der Datei verknüpft und old_p von der Datei getrennt. Schreibberechtigungen sind sowohl für das Verzeichnis erforderlich, das old_p enthält, als auch für das Verzeichnis, das new_p enthält.
- Wenn old_p ein Verzeichnis ist, muss new_p eine der folgenden Bedingungen erfüllen:
- dasselbe Verzeichnis wie old_p oder ein Hardlink dazu: In diesem Fall wird nichts unternommen.
- ein existierendes Verzeichnis: new_p wird auf POSIX-Systemen gelöscht, wenn es leer ist, dies kann jedoch auf anderen Systemen ein Fehler sein. Wenn es kein Fehler ist, wird new_p zuerst gelöscht. Dann, ohne dass andere Prozesse new_p als gelöscht wahrnehmen können, wird der Pfadname new_p mit dem Verzeichnis verknüpft und old_p vom Verzeichnis getrennt. Schreibberechtigungen sind sowohl für das Verzeichnis erforderlich, das old_p enthält, als auch für das Verzeichnis, das new_p enthält.
- ein nicht existierendes Verzeichnis, das nicht mit einem Verzeichnistrenner endet und dessen Elternverzeichnis existiert: Der Pfadname new_p wird mit dem Verzeichnis verknüpft und old_p vom Verzeichnis getrennt. Schreibberechtigungen sind sowohl für das Verzeichnis erforderlich, das old_p enthält, als auch für das Verzeichnis, das new_p enthält.
- Symlinks werden nicht verfolgt: Wenn old_p ein Symlink ist, wird er selbst umbenannt, nicht sein Ziel. Wenn new_p ein existierender Symlink ist, wird er selbst gelöscht, nicht sein Ziel.
Das Umbenennen schlägt fehl, wenn
- new_p mit einem Punkt (dot) oder einem Doppelpunkt (dot-dot) endet.
- new_p ein nicht existierendes Verzeichnis bezeichnet, das mit einem Verzeichnistrenner endet.
- old_p ein Verzeichnis ist, das ein Vorfahre von new_p ist.
Inhalt |
[edit] Parameter
| old_p | - | Pfad, der verschoben oder umbenannt werden soll |
| new_p | - | Zielpfad für die Verschiebe-/Umbenennungsoperation |
| 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 Fehlern der zugrundeliegenden OS-API. Die Ausnahme wird mit old_p als erstes Pfadargument, new_p als zweites Pfadargument und dem OS-Fehlercode als Fehlercodeargument konstruiert.
2) 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] Beispiel
Führen Sie diesen Code aus
#include <filesystem> #include <fstream> namespace fs = std::filesystem; int main() { std::filesystem::path p = std::filesystem::current_path() / "sandbox"; std::filesystem::create_directories(p / "from"); std::ofstream{ p / "from/file1.txt" }.put('a'); std::filesystem::create_directory(p / "to"); // fs::rename(p / "from/file1.txt", p / "to/"); // error: "to" is a directory fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // OK // fs::rename(p / "from", p / "to"); // error: "to" is not empty fs::rename(p / "from", p / "to/subdir"); // OK std::filesystem::remove_all(p); }
[edit] Siehe auch
| benennt eine Datei um (function) | |
| (C++17)(C++17) |
entfernt eine Datei oder ein leeres Verzeichnis entfernt eine Datei oder ein Verzeichnis und dessen gesamten Inhalt rekursiv (Funktion) |