Namespaces
Variants

std::filesystem:: equivalent

From cppreference.net
Défini dans l'en-tête <filesystem>
bool equivalent ( const std:: filesystem :: path & p1,
const std:: filesystem :: path & p2 ) ;
(1) (depuis C++17)
bool equivalent ( const std:: filesystem :: path & p1,

const std:: filesystem :: path & p2,

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

Vérifie si les chemins p1 et p2 résolvent vers la même entité du système de fichiers.

Si soit p1 ou p2 n'existe pas, une erreur est signalée.

La surcharge non levante retourne false en cas d'erreurs.

Table des matières

Paramètres

p1, p2 - chemins à vérifier pour l'équivalence
ec - paramètre de sortie pour le rapport d'erreur dans la surcharge non-lançante

Valeur de retour

true si p1 et p2 font référence au même fichier ou répertoire et que leur statut de fichier est identique. false sinon.

Exceptions

Toute surcharge non marquée noexcept peut lever std::bad_alloc si l'allocation de mémoire échoue.

1) Lance std::filesystem::filesystem_error en cas d'erreurs de l'API système sous-jacente, construit avec p1 comme premier argument de chemin, p2 comme deuxième argument de chemin, et le code d'erreur du système comme argument de code d'erreur.
2) Définit un paramètre std:: error_code & au code d'erreur de l'API du système d'exploitation si un appel d'API système échoue, et exécute ec. clear ( ) si aucune erreur ne survient.

Notes

Deux chemins sont considérés comme résolvant vers la même entité du système de fichiers si les deux entités candidates vers lesquelles les chemins se résolvent sont situées sur le même périphérique au même emplacement. Pour POSIX, cela signifie que les membres st_dev et st_ino de leur stat structure POSIX, obtenus comme s'ils l'étaient par stat() POSIX, sont égaux.

En particulier, tous les liens physiques pour le même fichier ou répertoire sont équivalents, et un lien symbolique et sa cible sur le même système de fichiers sont équivalents.

Exemple

#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    // équivalence de lien physique
    fs::path p1 = ".";
    fs::path p2 = fs::current_path();
    if (fs::equivalent(p1, p2))
        std::cout << p1 << " est équivalent à " << p2 << '\n';
    // équivalence de lien symbolique
    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 << " est équivalent à " << p2 << '\n';
    }
}

Sortie possible :

"." 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"

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 2937 C++17 condition d'erreur spécifiée incorrectement corrigé

Voir aussi

compare les représentations lexicales de deux chemins lexicographiquement
(fonction membre publique de 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)
compare lexicographiquement deux chemins
(fonction)
(C++17) (C++17)
détermine les attributs de fichier
détermine les attributs de fichier, en vérifiant la cible du lien symbolique
(fonction)