Namensräume
Varianten
Aktionen

std::filesystem::equivalent

Von cppreference.com
 
 
 
Definiert in Header <filesystem>
bool equivalent( const std::filesystem::path& p1,
                 const std::filesystem::path& p2 );
(1) (seit C++17)
bool equivalent( const std::filesystem::path& p1,

                 const std::filesystem::path& p2,

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

Prüft, ob die Pfade p1 und p2 auf dieselbe Dateisystementität verweisen.

Wenn p1 oder p2 nicht existieren, wird ein Fehler gemeldet.

Die nicht-werfende Überladung gibt bei Fehlern false zurück.

Inhalt

[edit] Parameter

p1, p2 - Pfade, die auf Gleichheit geprüft werden sollen.
ec - Ausgabeparameter für die Fehlerberichterstattung in der nicht auslösenden Überladung

[edit] Rückgabewert

true, wenn p1 und p2 auf dieselbe Datei oder dasselbe Verzeichnis verweisen und ihr Dateistatus derselbe ist. Andernfalls false.

[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 zugrundeliegenden Betriebssystem-API-Fehlern, konstruiert mit p1 als erstes Pfadargument, p2 als zweites Pfadargument und dem Betriebssystem-Fehlercode als Fehlercodeargument.
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] Hinweise

Zwei Pfade gelten als auf dieselbe Dateisystementität verweisend, wenn die beiden Kandidatenentitäten, auf die die Pfade aufgelöst werden, sich auf demselben Gerät an demselben Ort befinden. Unter POSIX bedeutet dies, dass die Mitglieder st_dev und st_ino ihrer POSIX stat-Struktur, die wie durch POSIX stat() erhalten werden, gleich sind.

Insbesondere sind alle Hardlinks für dieselbe Datei oder dasselbe Verzeichnis äquivalent, und ein Symlink und sein Ziel auf demselben Dateisystem sind äquivalent.

[edit] Beispiel

#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    // hard link equivalency
    fs::path p1 = ".";
    fs::path p2 = fs::current_path();
    if (fs::equivalent(p1, p2))
        std::cout << p1 << " is equivalent to " << p2 << '\n';
 
    // symlink equivalency
    for (const fs::path lib : {"/lib/libc.so.6", "/lib/x86_64-linux-gnu/libc.so.6"})
    {
        try
        {
            p2 = lib.parent_path() / fs::read_symlink(lib);
        }
        catch (std::filesystem::filesystem_error const& ex)
        {
            std::cout << ex.what() << '\n';
            continue;
        }
 
        if (fs::equivalent(lib, p2))
            std::cout << lib << " is equivalent to " << p2 << '\n';
    }
}

Mögliche Ausgabe

"." is equivalent to "/var/tmp/test"
filesystem error: read_symlink: No such file or directory [/lib/libc.so.6]
"/lib/x86_64-linux-gnu/libc.so.6" is equivalent to "/lib/x86_64-linux-gnu/libc-2.23.so"

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2937 C++17 Fehlerbedingung falsch spezifiziert korrigiert

[edit] Siehe auch

vergleicht die lexikalischen Darstellungen zweier Pfade lexikographisch
(öffentliche Memberfunktion von std::filesystem::path) [edit]
(C++17)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++20)
vergleicht zwei Pfade lexikographisch
(function) [edit]
(C++17)(C++17)
ermittelt Dateiattribute
ermittelt Dateiattribute, wobei das Ziel des symbolischen Links geprüft wird
(Funktion) [bearbeiten]