Namensräume
Varianten
Aktionen

std::filesystem::rename

Von cppreference.com
 
 
 
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,

             std::error_code& ec ) noexcept;
(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

#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) [bearbeiten]
(C++17)(C++17)
entfernt eine Datei oder ein leeres Verzeichnis
entfernt eine Datei oder ein Verzeichnis und dessen gesamten Inhalt rekursiv
(Funktion) [bearbeiten]