Nur files im Directory listen



  • Hallo,
    ich suche nach einer Möglichkeit, nur die Dateien in einem Ordner aufzulisten. Für mich selbst habe ich eine etwas umständliche Lösung gefunden, es geht aber bestimmt besser?

    namespace fs = std::filesystem;
    
    void reverseString(std::string& str)
    {
    	auto first = str.begin();
    	auto last = str.end();
    	while ((first != last) && (first != --last))
    	{
    		std::iter_swap(first, last);
    		++first;
    	}
    }
    
    std::string untilSlash(const std::string& str)
    {
    	std::string cl_str;
    	for (auto ch : str)
    	{
    		if (ch != '/')
    		{
    			cl_str.push_back(ch);
    		}
    		else
    		{
    			break;
    		}
    	}
    	return cl_str;
    }
    
    std::string getLastSeq(std::string& str)
    {
    	reverseString(str);
    	std::string nstr = untilSlash(str);
    	reverseString(nstr);
    	return nstr;
    }
    
    int main()
    {
    	std::string path = ".../";
    	std::cout << path << '\n';
    	fs::path p = path;
    	for (const auto& p : fs::directory_iterator(p))
    	{
    		std::string p_str = p.path().u8string();
    		std::cout << getLastSeq(p_str) << '\n';
    	}
    	
    }
    


  • Meinst du

    int main()
    {
    	std::string path = ".../";
    	std::cout << path << '\n';
    	fs::path p = path;
    	for (const auto& e : fs::directory_iterator(p))
    		std::cout << e.path().filename() << '\n';
    }
    

    ?



  • Oder willst du wissen wie man das selbst einfacher programmieren kann als 2x den String zu reversen?



  • Öh, ja. Danke 🙂

    Ich habe wirklich vorher gesucht, ellenlange Stackoverflow-Threads. Klasse, das das wieder so einfach geht.

    EDIT: Nö, nö, ich habe nur nach einer einfacheren Lösung gesucht, also Deine Antwort.



  • OK, dann erklär ich dir noch wie du das selbst findest.

    1. Google nach "fs::directory_iterator"
      Erstes Ergebnis: https://en.cppreference.com/w/cpp/filesystem/directory_iterator
    2. Da findest du dass der Iterator diese Teile da ausspuckt: https://en.cppreference.com/w/cpp/filesystem/directory_entry
    3. Dort wiederrum findest du die Memberfunktio "path": https://en.cppreference.com/w/cpp/filesystem/directory_entry/path
    4. Dort siehst du dann dass die ein std::filesystem::path Objekt zurückgibt + Link zur Doku darüber: https://en.cppreference.com/w/cpp/filesystem/path
    5. Jetzt siehst du alle Memberfunktionen, und dass diese path Teile eine filename Memberfunktion haben.
    6. Tadaa, Bob ist dein Onkel


  • Alles klar, danke. Auch suchen will gelernt sein. Das wird mir bestimmt bei der nächsten Suche helfen.



  • ps: Eigentlich wäre "filesystem::directory_iterator" der bessere Suchbegriff, weil der Namespace halt in in echt "filesystem" heisst. "fs" ist nur ein Alias der in vielen Beispielen verwendet wird. Bei mir hats aber auch mit "fs" funktioniert. Und Googeln natürlich ohne die "". Mit den "" müsste der Match exakt sein, d.h. Google stellt sich doof weil man ihm ja quasi verboten hat den Suchbegriff etwas freier zu interpretieren.

    Und natürlich, bei diesem speziellen Beispiel, wenn du z.B. eh schon weisst was du bei e.path() zurückbekommst... fängst du logischerweise mit dem Suchbegriff "std::filesystem::path" an.



  • Ja, ich habe aber das Prinzip verstanden, sich durch die reference zu hangeln, bis man zum gesuchten kommt. Habe ich in einigen Fällen sogar schon ähnlich gemacht. Warum das nun bei dem simplen path().filename() nicht geklappt hat? Wahrscheinlich weil bei der ersten Suche ins Blaue so gar kein Ergebnis gekommen ist. Ich konnte mir aber auch nicht richtig vorstellen, das es das nicht gibt.

    Wenn ich nochmal suchen müsste, würde ich es, wie Onkel Bob vorgeschlagen hat, so machen 😉


Log in to reply