[Gelöst] Wieso gibt fs::path::relative_path bei recursive_directory_iterator nicht den Pfad des ctor Arguments?



  • Hallo,

    ich wollte rekursiv einen Ordner Verschlüsseln und als Output einen anderen Ordner wählen, dabei soll die Ordnerstruktur behalten werden.

    Das Problem ist, dass bei z.B.

    for (const auto& d : recursive_directory_iterator{"C:/Users/foo/data"}) {
        std::cout << d.path().relative_path() << '\n';
    }
    

    Die Ausgabe eben so aussieht:

    Users/foo/data/dir1
    Users/foo/data/dir2
    

    ich erwarte eigentlich diese Ausgabe:

    dir1
    dir2
    

    Das C:/Users/foo/data wurde ja im Konstruktur schon angegeben, und von diesem Pfad aus sollte der relative Pfad m. E. nach bestimmt werden, damit ich in meinem Zielordner die Ordnerstruktur beibehalten kann.

    Sonst muss ich halt wieder nur den normalen directory_iterator nehmen, und selbst rekursiv die Unterordner besuchen.

    Kann mir jemand sagen, warum relative_path eigentlich garnicht den relativen Pfad zurück gibt, sondern nur einen relativen Pfad, indem es ganz billig das C:/ vorne abschneidet? Das nützt doch garnichts.

    Oder bin ich selber der Blöde, und verstehe die filesystem Bibliothek einfach nicht?^^

    Ich verwende GCC 8.2 unter Windows 10.

    LG



  • d.path() gibt ein std::filesystem::path zurück und der hat keine Ahnung mehr vom iterator.
    relative_path() gibt einen relativen Pfad zum Root Pfad. In dem Fall "C:/" oder "D:/" ... auf Windows.

    was du suchst ist https://en.cppreference.com/w/cpp/filesystem/path/lexically_normal
    lexically_relative



  • @5cript Vielen Dank für Deine Antwort. Macht genau was ich wollte. Hab ich irgendwie übersehen.

    for (const auto& d : recursive_directory_iterator{basePath}) {
            std::cout << d.path().lexically_relative(basePath) << '\n'; }
    

    LG


Anmelden zum Antworten