QT - Alle Dateien in einem Ordner einlesen



  • Hallo,

    ich fange gerade mit QT an und habe ein Frage hierzu:

    Ich habe einen Ordner z.B. c:\test.

    Nun möchte ich in dem Ordner in einem Array o.ä. sämtliche Dateien erfahren, die eine Bestimmte Endung haben

    z.b.
    im Ordner befindet sich
    1.txt
    2.txt
    3.txt
    und ich hätte gerne
    Datei[0] = C:\test\1.txt
    Datei[1} = c:\test\2.txt
    Datei[3] = c:\test\3.txt
    usw
    oder halt was ädaquates

    wie mache ich das in QT?

    Danke



  • In den Samples von QT ist ein Beispiel dabei...
    http://doc.qt.nokia.com/4.2/dialogs-findfiles.html



  • QDir::entryList() sollte genau die funktion sein, die du brauchst



  • Hallo,

    erstmal vielen Dank.

    Hab nun ein bisschen rumprobiert und es so gemacht:

    QDir directory("C:/Users/alex/Desktop/Bilmaterial");
    
    	QStringList Filter;
    	Filter << "*.bmp";//.append("*.bmp");
    
    	QStringList flist = directory.entryList(Filter);//,0,0);
    
    	QStringList::const_iterator test;
    	for(test = flist.constBegin();test!= flist.constEnd(); ++test)
    		std::cout << (*test).toLatin1().constData() << std::endl;
    

    So scheints zu laufen, ist da alles "richtig" oder gibts dazu noch Verbesserungsvorschläge?

    Und eine Frage habe ich noch:
    Wieso steht in der Docu, dass ich die Adresse von QStringList nehmen muss für die Filter ( http://doc.qt.nokia.com/latest/qdir.html#entryList ), aber wenn ichs mit dem & Operator anspreche gehts net?

    Danke



  • Das steht da, weil du dir gedanken machen sollst über die unterschiede von pointern und referenzen.



  • Gut, vll ne dumme Frage, aber ich weiß es wirklich nicht:

    Ich habe doch ein QStringList und eben KEINEN QStringList*. Somit habe ich doch eben keinen Pointer und hatte erstmal reingeschrieben &QStringList und war dann überrascht, dass es der Compiler nicht frisst...

    Danke



  • google mal Parameterübergabe "per value" und "per reference". Und nun stell dir mal vor da packt einer diese QStringList rein, weil er bisserl blöd ist und alle Dateien will mit 3 NachPunktStellen die keine Zahlen enthalten:

    QString ext;
        for(int i='a'; i <= 'z'; ++i)
            for(int j='a'; j <= 'z'; ++j)
                for(int k='a'; k <= 'z'; ++k)
                {
                   QString end("*.");
                   end.append(QChar(i)).append(QChar(j)).append(QChar(k)).append(", ");
                   ext.append(end+end.toUpper());
                }
    
        QDir directory("C:/Users/alex/Desktop/Bilmaterial"); 
        QStringList flist = directory.entryList(ext.split(","));
    

    Abgesehen davon ist es hier streng genommen egal, da Qt implict sharing benutzt und somit eigentlich nur ein pointer Kopiert wird, die Methode hätte also auch mit const QStringList filer funktioniert - ABER da die API das so will, musstes halt ohne pointers machen, oder den pointer dereffen ...

    Test:
    Gegeben ist eine Methode ' void Test(int , int * , int & ) {} ', welcher Aufruf ist richtig?

    int a = 42; int * b = &a; int &c = a;
        // ohne Anspruch auf Vollständigkeit ....
        Test( a, &a, a);
        Test( c, &a, a);
        Test( a, &a, *b);
        Test( c, &a, *b);
        Test( a, &a, c);
        Test( a, b , a);
        Test( c, &c, a);
        Test( a, &c, a);
        Test(*b, &a, *b);
        Test( c, &c, *b);
        Test(*b, b , *b);
        Test( a, b , *b);
        Test( a, b , c);
        Test(*b, &c, *b);
        Test( c, &a, c);
        Test( c, b , a);
        Test( a, &c, *b);
        Test( a, &c, c);
        Test( c, b , *b);
        Test( c, b , c);
        Test( c, &c, c);
    


  • So als dsa mit Referenzen war mir vorher wohl nicht so ganz klar.

    Also ich würde sagen, dass
    c und a gleich sind

    daher
    Test( a, &a, a);
    Test( c, &a, a);
    Test( a, &a, c);
    Test( c, b , a);
    Test( c, b , c);
    Test( a, b , c);
    Test( a, b , a);
    Test( a, &c, c);
    Test( c, &c, c);
    Test( c, &c, a);
    Test( a, &c, a);

    richtige Aufrufe sind?



  • Also mein Compiler schluckt die alle ohne Fehler 😉



  • Hi,
    das was ihr da oben geschrieben habt hat mir bei meinem Problem geholfen. Solche Forums sind ja immer ziemlich hilfreich.

    Ich hab aber zusätzlich noch 2 Fragen.
    Wenn ich mir den Ordnerinhalt in ein QStringlist einlesen paßt das.
    Das kann ich dann testen indem ich qDebug() << OrdnerInhalt; mir ausgeben lasse.
    So sieht dann z.B. meine Ausgabe in der Konsole aus: ("copy.png", "Kopie von open.png", "paste.png", "save.png")

    Meine Frage lautet nun ob ich irgendwie auf ein bestimmtes Element dieser Stringlist zugreifen kann ohne das ich weiß wie das Element heißt? Wie lautet da der Befehl wenns denn den gibt? Ich such halt sowas wie z.B. "Ordnerinhalt.getElement[2]" und dann wird mir das entsprechende Element ausgegeben.

    Dieser Teil des obrigen Codes funktioniert bei mir übrigens auch nicht:

    QStringList::const_iterator test;
        for(test = flist.constBegin();test!= flist.constEnd(); ++test)
            std::cout << (*test).toLatin1().constData() << std::endl;
    

    Meine 2 Frage lautet wie viel ich in so eine StringList reinschreiben darf? Ich hab nämlich bisschen Probleme wenn ich mehr als 10 Dateiennamen einlese. Aber kann auch an was anderem liegen das der dann abstürtzt.

    ok, hoffe ihr koennt helfen.

    schönes WE dann soweit

    mfg Cascoin



  • Ok, hab mit anderen Suchanfragen des Forum gesucht und bin fündig geworden.

    Also hat meine eine

    QStringlist fliste;
    fliste<< "one" << "two" << "three";
    flist.at(1);
    // Ausgegeben wird dann two.....
    

    Noch kurz zu meiner anderen Frage? Wieviel darf ich in so eine QStringlist reinschreiben? Gibts da überhaupt ein Limit?
    mfg Cascoin


Anmelden zum Antworten