Namespaces
Variants

std::filesystem:: equivalent

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

Überprüft, ob die Pfade p1 und p2 zur selben Dateisystem-Entität aufgelöst werden.

Wenn entweder p1 oder p2 nicht existiert, wird ein Fehler gemeldet.

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

Inhaltsverzeichnis

Parameter

p1, p2 - Pfade, die auf Äquivalenz geprüft werden sollen
ec - Out-Parameter für Fehlerberichterstattung in der nicht-werfenden Überladung

Rückgabewert

true wenn p1 und p2 auf dieselbe Datei oder dasselbe Verzeichnis verweisen und ihr Dateistatus identisch ist. false andernfalls.

Exceptions

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 p1 als erstem Pfadargument, p2 als zweitem Pfadargument und dem OS-Fehlercode als Fehlercodeargument.
2) Setzt einen std:: error_code & Parameter auf den OS-API-Fehlercode, wenn ein OS-API-Aufruf fehlschlägt, und führt ec. clear ( ) aus, wenn keine Fehler auftreten.

Hinweise

Zwei Pfade werden als identische Dateisystem-Entitäten betrachtet, wenn die beiden Kandidaten-Entitäten, auf die die Pfade verweisen, sich auf demselben Gerät an derselben Position befinden. Für POSIX bedeutet dies, dass die st_dev - und st_ino -Member ihrer POSIX stat -Struktur , ermittelt wie durch POSIX stat() , 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.

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"

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 Fehlerzustand falsch angegeben korrigiert

Siehe auch

vergleicht die lexikalischen Darstellungen zweier Pfade lexikographisch
(öffentliche Elementfunktion von std::filesystem::path )
(C++17) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++20)
vergleicht zwei Pfade lexikographisch
(Funktion)
(C++17) (C++17)
bestimmt Dateiattribute
bestimmt Dateiattribute, überprüft das Symlink-Ziel
(Funktion)