Namespaces
Variants

std::filesystem:: rename

From cppreference.net
Definiert im 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,

std:: error_code & ec ) noexcept ;
(2) (seit C++17)

Verschiebt oder benennt das Dateisystemobjekt, das durch old_p identifiziert wird, nach new_p , wie durch die POSIX-Funktion rename :

  • Wenn old_p eine Nicht-Verzeichnisdatei ist, dann muss new_p eines der folgenden sein:
  • dieselbe Datei wie old_p oder ein Hardlink darauf: In diesem Fall wird nichts unternommen.
  • existierende Nicht-Verzeichnisdatei: new_p wird zunächst gelöscht, dann wird – ohne anderen Prozessen die Möglichkeit zu geben, new_p als gelöscht zu beobachten – 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.
  • 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, das old_p enthält, als auch für das Verzeichnis, das new_p enthält, erforderlich.
  • Wenn old_p ein Verzeichnis ist, dann muss new_p eines der folgenden sein:
  • dasselbe Verzeichnis wie old_p oder ein Hardlink darauf: In diesem Fall wird nichts unternommen.
  • bestehendes Verzeichnis: new_p wird unter POSIX-Systemen gelöscht, falls leer, kann aber auf anderen Systemen einen Fehler verursachen. Falls kein Fehler auftritt, wird new_p zuerst gelöscht, dann, ohne anderen Prozessen die Möglichkeit zu geben, new_p als gelöscht zu beobachten, 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 erforderlich, das new_p enthält.
  • nicht existierendes Verzeichnis, das nicht mit einem Verzeichnisseparator 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 erforderlich, 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.

Umbenennen schlägt fehl, wenn

  • new_p endet mit dot oder mit dot-dot .
  • new_p benennt ein nicht existierendes Verzeichnis, das mit einem Verzeichnisseparator endet.
  • old_p ist ein Verzeichnis, das ein Vorgänger von new_p ist.

Inhaltsverzeichnis

Parameter

old_p - Pfad zum Verschieben oder Umbenennen
new_p - Zielpfad für die Verschiebe-/Umbenennungsoperation
ec - Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung

Rückgabewert

(keine)

Ausnahmen

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

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

Beispiel

#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/"); // Fehler: "to" ist ein Verzeichnis
    fs::rename(p / "from/file1.txt", p / "to/file2.txt"); // OK
//  fs::rename(p / "from", p / "to"); // Fehler: "to" ist nicht leer
    fs::rename(p / "from", p / "to/subdir"); // OK
    std::filesystem::remove_all(p);
}

Siehe auch

benennt eine Datei um
(Funktion)
(C++17) (C++17)
entfernt eine Datei oder leeres Verzeichnis
entfernt eine Datei oder Verzeichnis und alle dessen Inhalte rekursiv
(Funktion)