Namensräume
Varianten
Aktionen

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 hat
noexcept-Spezifikation:  
noexcept
  

[edit] Beispiel

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