Ordnerstruktur einlesen



  • Erstmal danke für die Hilfe, leider bringt mich das so nicht weiter. Fremde Bibliotheken bringen mir nichts da es sich bei dem externen Gerät um ein Telefon handelt, welches über ein separates Programm angesprochen wird und nicht als Datenträger im OS auftaucht.

    Ich kann dem Gerät wie gesagt nur über eine externe Programmschnittstelle ein Directory Listing entlocken. Das mache ich bisher für die Root Ebene auch erfolgreich.

    Sprich ich lese ein normales "ls" und ein "ls -l" in 2 Arrays und vergleiche anschließend die Arrays Schritt für Schritt miteinander. Beginnt das Array mit den "ls -l" Ausgaben mit einem d ist es ein Ordner (in meinem Fall wichtig um passende Icons für ein TreeWidget anzuhängen) ansonsten halt eine Datei.

    Das in deinem Post im Nebensatz behandelte "..und dann rekursiv weiterfahren" bekomme ich halt nicht auf die Kette.


  • Mod

    cardex schrieb:

    Das in deinem Post im Nebensatz behandelte "..und dann rekursiv weiterfahren" bekomme ich halt nicht auf die Kette.

    Wenn du die Verzeichnisse im root Verzeichnis kennst, dann kannst du auf diesen wiederum deinen Verzeichnisholbefehl ausführen, usw.



  • Ich steh da wohl wirklich auf dem Schlauch. Hier mal Teile des Codes für die Root Ebene.

    void readDeviceThread::processLogFile() {
        int i = 1;
        //schnipp
        //hier werden die 2 Listing in einem QProzess nacheinander in die Dateien
        //list.log und list2.log geschrieben.
        //schnapp
    
        QFile log1("list.log");
        if (!log1.open(QIODevice::ReadOnly | QIODevice::Text)) {
                 return;
        }
        QFile log2("list2.log");
        if (!log2.open(QIODevice::ReadOnly | QIODevice::Text)) {
                 return;
        }
        QTextStream readLog1(&log1);
        QTextStream readLog2(&log2);
        while (!readLog1.atEnd()) {
            temp1[i] = readLog1.readLine();
            temp2[i] = readLog2.readLine();
            i++;
        }
        dirCount = i;
        log1.close();
        log2.close();
        createItems(dirCount);
    }
    
    void readDeviceThread::createItems(int dirCount) {
        QIcon folder;
        QString ls[200] = temp1;
        QString lsl[200] = temp2;
        for(int i=1;i<dirCount;i++) {
            if(lsl[i].startsWith("d")) {
                folder.addFile("folder.png");
                QTreeWidgetItem *Children = new QTreeWidgetItem(pItems);
                Children->setIcon(0, folder);
                Children->setText(0, ls[i]);
            }
            else {
                folder.addFile("file.png");
                QTreeWidgetItem *Children = new QTreeWidgetItem(pItems);
                Children->setIcon(0, folder);
                Children->setText(0, ls[i]);
            }
        }
        emit sendFinish(3);
    }
    


  • wie sag ichs nett :)))

    Logikfehler ... falls ls-l nur Directories liefert ist dessen Länge nicht unbedingt == ls ... falls ls -l nur ein d davorsetzt, wofür dann 2 Listen?
    Dann fliegt dir das um die Ohren:

    while (!readLog1.atEnd()) { // << können verschieden lang sein
            temp1[i] = readLog1.readLine();
            temp2[i] = readLog2.readLine();
            i++;
        }
    

    ... was passiert bei ls / ls -l bei folgender Struktur?

    dir1_das_ist_ein_dir
    dir2_das_ist_noch_ein_dir
    datei1_das_ist_eine_datei_namens_datei1
    datei2_das_ist_eine_datei_namens_datei2
    


  • bessere Infos, bessere Antowort ... siehe unten



  • Nur mit C++ ist dirent.h ,sys/types.h und sys/stat.h was du brauchst.
    Benutz immer dirent.h um Dateien aus Ordnern auszulesen ist eigendlich recht einfach aber eine Ordnerhierarchie das würde auch gehn.



  • padreigh schrieb:

    wie sag ichs nett :)))

    Logikfehler ... falls ls-l nur Directories liefert ist dessen Länge nicht unbedingt == ls ... falls ls -l nur ein d davorsetzt, wofür dann 2 Listen?
    Dann fliegt dir das um die Ohren:

    while (!readLog1.atEnd()) { // << können verschieden lang sein
            temp1[i] = readLog1.readLine();
            temp2[i] = readLog2.readLine();
            i++;
        }
    

    nee der teil ist schon in ordnung. in beiden logfiles steht immer die identische anzahl an einträgen. nur einmal nur die datei bzw ordnernamen und einmal das linux typische ausführlichere listing. und da ich mir das rausschneiden der namen aus dem ausführlichen listing sparen will gibt es halt 2 files.

    die files sehen dann zB so aus.

    sbin
    proc
    init.rc
    init.goldfish.rc
    init
    default.prop
    data
    root
    dev
    
    drwxr-x--- root     root              1970-01-01 00:00 sbin
    dr-xr-xr-x root     root              1970-01-01 00:00 proc
    -rwxr-x--- root     root        12215 1970-01-01 00:00 init.rc
    -rwxr-x--- root     root         1677 1970-01-01 00:00 init.goldfish.rc
    -rwxr-x--- root     root       103112 1970-01-01 00:00 init
    -rw-r--r-- root     root          118 1970-01-01 00:00 default.prop
    drwxrwx--x system   system            2010-09-12 11:25 data
    drwx------ root     root              2010-01-28 00:59 root
    drwxr-xr-x root     root              2010-09-15 07:41 dev
    

    deinen beispielcode muss ich erst noch verdauen 😉



  • In dem alten sind Fehler drin, versuch das hier zu verstehen oder machs selbst 😉

    $ cat ressorces.qrc 
    <RCC>
        <qresource prefix="/icon">
            <file alias="file.png">image.png</file>
            <file alias="folder.png">folder.png</file>
        </qresource>
    </RCC>
    
    $ cat tessst.pro
    SOURCES += main.cpp
    RESOURCES += ressorces.qrc
    
    $ cat main.cpp
    #include <QApplication>
    
    #include <Qt>
    #include <QStringList>
    #include <QDebug>
    #include <QTreeWidget>
    #include <QTableWidgetItem>
    
    /// fake return in desired format
    QStringList createLog(QString path)
    {
        QStringList listOfFiles;                                                                      
    
        // Simulated Structure:  
        // .
        // |-- data
        // |   |-- leeresVerz
        // |   `-- data-datei1
        // |-- default.prop
        // |-- init
        // |-- init.goldfish.rc
        // |-- init.rc
        // |-- root
        // |   `-- root-datei1
        // `-- sbin
        //     `-- sbin-datei1
    
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        // gefakte returns ;)                                                                           //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        if (path=="/")                                                                                  //
        {                                                                                               //
            listOfFiles << "drwxr-x--- root     root              1970-01-01 00:00 sbin"                //
                        << "-rwxr-x--- root     root        12215 1970-01-01 00:00 init.rc"             //
                        << "-rw-r--r-- root     root          118 1970-01-01 00:00 default.prop"        //
                        << "drwxrwx--x system   system            2010-09-12 11:25 data"                //
                        << "-rwxr-x--- root     root         1677 1970-01-01 00:00 init.goldfish.rc"    //
                        << "-rwxr-x--- root     root       103112 1970-01-01 00:00 init"                //
                        << "drwx------ root     root              2010-01-28 00:59 root";               //
        }                                                                                               //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        else if (path == "sbin")                                                                        //
        {                                                                                               //
            listOfFiles << "-rw-r--r-- root     root          118 1970-01-01 00:00 sbin-datei1";        //
        }                                                                                               //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        else if (path =="data")                                                                         //
        {                                                                                               //
            listOfFiles << "-rw-r--r-- root     root          118 1970-01-01 00:00 data-datei1"         //
                        << "drwxr-x--- root     root              1970-01-01 00:00 leeresVerz";         //
        }                                                                                               //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        else if (path=="root")                                                                          //
        {                                                                                               //
            listOfFiles << "-rw-r--r-- root     root          118 1970-01-01 00:00 root-datei1";        //
        }                                                                                               //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
        else if (path=="leeresVerz")                                                                    //
        {                                                                                               //
            return QStringList();                                                                       //
        }                                                                                               //
        // ///////////////////////////////////////////////////////////////////////////////////////////////
    
        qDebug() << "returned directory content for path: '" + path + "'";
        qDebug() << listOfFiles.join("\n");
    
        QStringList parsedList;
    
        const QString permissions ("((r|w|x|-){3}){3}\\s+");                     // (((r oder w oder x oder -) DREIMAL) DREIMAL) whitespaces MEHRALS0
        const QString owner_group ("(\\w+\\s+){2}");                             // (zahlen/buchstaben MEHRALS0, whitespaces MEHRALS0) ZWEIMAL
        const QString filesize    ("\\d+\\s+");                                  // (zahlen MEHRALS0 whitespaces MEHRALS0
        const QString date_time   ("\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}\\s");   // zahlen VIER - zahlen ZWEI - zahlen ZWEI usw.
    
        const QRegExp files ("^-"+permissions+owner_group+filesize+date_time);   // stringstart mit - dann rest
        const QRegExp dirs  ("^d"+permissions+owner_group+date_time);            // stringstart mit d dann rest
    
         foreach (QString one, listOfFiles)
        {
            bool isDir = one.startsWith("d");
    
            QString test(one);
    
            if (isDir)
                test.replace(dirs,"").prepend("_DIR_");   // remove all the stuff beside file name
            else                                          // you could get problems if filenames allow ' ' in the name and use '\'  
                test.replace(files,"").prepend("_FIL_");  // or smth like "<whole name>" then. best check and adapt it accordingly 
    
            if (test==one) 
            {
                qDebug() << "\tPARSING WENT WRONG: " << one;
                if (test.startsWith(d))
                    parsedList << "_!!!_DIR_";
                else
                    parsedList << "_!!!_FIL_";
            } 
            else           
            { 
                parsedList << test; 
            }
        }
    
        qDebug() << "parsed directory: '" + path + "'";
        qDebug() << parsedList.join("\n");
    
        return parsedList;
    }
    
    QTreeWidgetItem * createItems(const QString path = "/", QTreeWidgetItem * parent=0) {
    
        const QIcon folder(":icon/folder.png");  // 2 famfamsilkicons v.0013 google it if you want :)
        const QIcon file(":icon/file.png");
    
        QStringList filesAndDirs;
    
        if (!parent)
        {
            // falls diese Methode mit createItems() aufgerufen wurde, konstruiere das "root" QTreeWidgetItems
            parent = new QTreeWidgetItem();
            parent->setIcon(0,folder);
            parent->setText(0,path);
        }
    
        // hole dir die Struktur des root-dirs
        filesAndDirs = createLog(path);
    
        QTreeWidgetItem *child;
    
        // we added a directory but it has no content
        if ( filesAndDirs.isEmpty() )
        {
            child = new QTreeWidgetItem(parent);
            child->setData(0, Qt::DisplayRole, "<empty subdir>");
            // nix rekursion, aber vielleicht ein empty icon?
        }
    
        // für jede Zeile (präfixed mit _FIL_ oder _DIR_)
        foreach (QString one, filesAndDirs)
        {
            if (one.startsWith("_!!!_FIL_"))
            {
                child = new QTreeWidgetItem(parent);
                // append some kind of "broken file" image for this ...
                // append some kind of "parsing broken" text 
                // nix rekursion
            }
            if (one.startsWith("_!!!_DIR_"))
            {
                child = new QTreeWidgetItem(parent);
                // append some kind of "broken folder" image for this ...
                // append some kind of "parsing broken" text 
                // nix rekursion da wir nicht wissen worein wir rekursieren sollen
            }
            if (one.startsWith("_DIR_"))
            {
                child = new QTreeWidgetItem(parent); // hängs unters parent, setze icon und text ohne präfix
                child->setData(0, Qt::DecorationRole, folder);
                child->setData(0, Qt::DisplayRole, one.remove(0,5) );
    
                createItems(one, child); // rekursion .. nun muss natürlich der Inhalt des Folders unter dieses child gehängt werden 
    
                // der returnwert ist egal da die items direkt eingehängt werden
            } else {
                child = new QTreeWidgetItem(parent);  // hängs unters parent, setze icon und text ohne präfix
                child->setData(0, Qt::DecorationRole, file);
                child->setData(0, Qt::DisplayRole, one.remove(0,5) );
                // nix rekursion
            }
        }
    
        return parent;
    }
    
    int main(int argv, char *args[])
    {
    
        QApplication app(argv, args);
    
        QTreeWidget t;
        t.setColumnCount(1);
        t.addTopLevelItem(   createItems() );
        t.expandAll();
        t.resizeColumnToContents(1);
        t.show();
    
        return app.exec();
    }
    

    edit: 2 ideen für broken parsing



  • wow vielen dank 👍



  • hab mal noch mehr kommentiert ... wenn du fragen hast 🙂 nur zu


Anmelden zum Antworten