std::filesystem Parent-Verzeichnisse



  • Hallo Forum,

    ich suche nach einem einigermaßen eleganten Weg, um ausgehend von einem std::filesystem::path auf seine parents zuzugreifen.

    Beispiel: ich würde gerne ausgehend von "myFile.txt" auf das Verzeichnis "bar" zugreifen.

       namespace fs = std::filesystem;
    
       fs::path myFile(R"(C:\foo\bar\baz\myDir\myFile.txt)");
    
       // (1) geht, ist aber nicht schön
       auto parentOfParent = myFile.parent_path().parent_path().parent_path();
    
    
       // (2) etwas schöner, geht aber nicht
       auto it = myFile.end();
       std::advance(it, -4);
    
       auto test1 = it->parent_path();  // ""
       fs::path test2(*it);             // "bar"
    
    
       // (3) gibt's leider nicht bzw. ist für char-sequenzen gedacht
       // fs::path test3(myFile.begin(), it);
    
    
       // (4) noch das beste, was mir einfällt
       it = myFile.end();
       std::advance(it, -3);
    
       fs::path test3;
       for (auto i = myFile.begin(); i != it; ++i)
          test3 /= *i;
    

    Ist (4) tatsächlich der einfachste Weg, sowas zu bewerkstelligen oder übersehe ich etwas?

    Vielen Dank vorab!



  • Was mir spontan eingefallen wäre, wäre wohl so etwas:

    myFile = myFile.append("../../..").lexically_normal();
    

    Aber schön ist das eigentlich auch nicht. Wofür brauchst du eigentlich überhaupt so etwas? Kennst du den Pfad schon oder kriegst du erst zur Runtime die Datei? Wenn erst zur Runtime, dann würde ich da nämlich auch lieber noch einmal ein paar Checks mit einbauen.



  • Danke für den Hinweis. Habe ich bisher nie verwendet, ist aber, wie du schon sagst, auch nicht wirklich schöner 😉 .

    Ich habe ein paar Messdaten auszuwerten, die in einer bestimmten Verzeichnisstruktur abgelegt sind, und wollte die Auswertung weitestgehend automatisieren. Ein Teil des Pfades ist für jeden Datensatz anders und beliebig, damit also im Prinzip erst zur Laufzeit bekannt. Der Inhalt eines bestimmten Unterverzeichnisses ist allerdings immer gleich und deswegen ist es in diesem Fall am einfachsten, wenn ich mich vom Unterverzeichnis zum Parent-Verzeichnis hangele.

    Das ist kein Produktivcode, sondern nur für die Auswertung einiger Messdatensätze gedacht. Ausgiebige Checks spare ich mir deswegen.

    Der Zugriff auf das Parent ist entsprechend auch kein wirkliches Problem, der Code muss nicht "schön" sein, aber die Frage kam halt in dem Zusammenhang auf.


Log in to reply