std::experimental::filesystem::rename
Von cppreference.com
< cpp | experimental | fs
| Definiert im Header <experimental/filesystem> |
||
| void rename( const path& old_p, const path& new_p ); void rename( const path& old_p, const path& new_p, std::error_code& ec ); |
(Dateisystem-TS) | |
Verschiebt oder benennt das durch old_p identifizierte Dateisystemobjekt zu new_p um, als ob durch das POSIX rename-Systemaufruf.
- Wenn old_p eine Nicht-Verzeichnis-Datei ist, muss new_p eines der folgenden sein:
- dieselbe Datei wie old_p oder ein Hardlink dazu: In diesem Fall wird nichts unternommen.
- eine vorhandene Nicht-Verzeichnis-Datei: new_p wird zuerst gelöscht, dann, ohne dass andere Prozesse new_p als gelöscht beobachten 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, das old_p enthält, als auch für das Verzeichnis, das new_p enthält, erforderlich.
- eine nicht vorhandene Datei in einem vorhandenen 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, das old_p enthält, als auch für das Verzeichnis, das new_p enthält, erforderlich.
- Wenn old_p ein Verzeichnis ist, muss new_p eines der folgenden sein:
- dasselbe Verzeichnis wie old_p oder ein Hardlink dazu: In diesem Fall wird nichts unternommen.
- ein vorhandenes Verzeichnis: new_p wird auf POSIX-Systemen gelöscht, wenn es leer ist, kann aber auf anderen Systemen einen Fehler verursachen. Wenn kein Fehler auftritt, wird new_p zuerst gelöscht, dann, ohne dass andere Prozesse new_p als gelöscht beobachten 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, das old_p enthält, als auch für das Verzeichnis, das new_p enthält, erforderlich.
- ein nicht vorhandenes Verzeichnis, das nicht mit einem Verzeichnistrenner endet und dessen übergeordnetes Verzeichnis existiert: Der Pfadname new_p wird mit dem Verzeichnis verknüpft und old_p vom Verzeichnis getrennt. Schreibberechtigungen sind sowohl für das Verzeichnis, das old_p enthält, als auch für das Verzeichnis, das new_p enthält, erforderlich.
- Symlinks werden nicht verfolgt: Wenn old_p ein Symlink ist, wird er selbst umbenannt, nicht sein Ziel. Wenn new_p ein vorhandener Symlink ist, wird er selbst gelöscht, nicht sein Ziel.
Die Umbenennung schlägt fehl, wenn
- new_p mit Punkt oder mit Punkt-Punkt endet.
- new_p ein nicht existierendes Verzeichnis benennt, 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
Die Überladung, die keinen Parameter vom Typ error_code& nimmt, wirft eine filesystem_error bei zugrundeliegenden Betriebssystem-API-Fehlern, konstruiert mit old_p als erstem Argument, new_p als zweitem Argument und dem Betriebssystemfehlercode als Fehlercode-Argument. std::bad_alloc kann geworfen werden, wenn die Speicherzuweisung fehlschlägt. Die Überladung, die einen Parameter vom Typ error_code& nimmt, setzt diesen auf den Betriebssystem-API-Fehlercode, wenn ein Aufruf der Betriebssystem-API fehlschlägt, und führt ec.clear() aus, wenn keine Fehler auftreten. Diese Überladung hatnoexcept-Spezifikation:
noexcept
[edit] Beispiel
Führen Sie diesen Code aus
#include <experimental/filesystem> #include <fstream> #include <iostream> namespace fs = std::experimental::filesystem; int main() { fs::path p = fs::current_path() / "sandbox"; fs::create_directories(p/"from"); std::ofstream(p/"from/file1.txt").put('a'); fs::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 fs::remove_all(p); }
[edit] Siehe auch
| benennt eine Datei um (function) | |
| entfernt eine Datei oder ein leeres Verzeichnis entfernt eine Datei oder ein Verzeichnis und dessen gesamten Inhalt rekursiv (Funktion) |