help in QDirIterator to a text file



  • i wanted to get a folder structure to a text file like this

    .
    ├── app
    │   ├── about
    │   │   ├── about.cpp
    │   │   ├── about.h
    │   │   └── about.ui
    │   ├── app.pro
    │   ├── bookmarks
    │   │   ├── bookmarkdialog.cpp
    │   │   ├── bookmarkdialog.h
    │   │   ├── bookmarkmanage.cpp
    │   │   ├── bookmarkmanage.h
    │   │   ├── bookmarks.cpp
    │   │   ├── bookmarks.h
    │   │   └── bookmarks.ui
    │   ├── coreaction
    │   │   ├── coreaction.cpp
    │   │   ├── coreaction.h
    │   │   └── coreaction.ui
    │   ├── corebox
    │   │   ├── corebox.cpp
    │   │   ├── corebox.h
    │   │   ├── corebox.ui
    │   │   ├── globalfunctions.cpp
    │   │   └── globalfunctions.h
    │   ├── coreimage
    │   │   ├── coreimage.cpp
    │   │   ├── coreimage.h
    │   │   └── coreimage.ui
    │   ├── corepad
    │   │   ├── coreedit.cpp
    │   │   ├── coreedit.h
    │   │   ├── corepad.cpp
    │   │   ├── corepad.h
    │   │   └── corepad.ui
    │   ├── corepdf
    │   │   ├── corepdf.cpp
    │   │   └── corepdf.h
    │   ├── coreplayer
    │   │   ├── coreplayer.cpp
    │   │   ├── coreplayer.h
    │   │   └── coreplayer.ui
    │   ├── corescreenshot
    │   │   ├── mainwindow.cpp
    │   │   ├── mainwindow.h
    │   │   ├── modefullscreen.cpp
    │   │   ├── modefullscreen.h
    │   │   ├── modeselectarea.cpp
    │   │   ├── modeselectarea.h
    │   │   ├── previewwidget.cpp
    │   │   ├── previewwidget.h
    │   │   ├── rectarea.cpp
    │   │   ├── rectarea.h
    │   │   ├── screenwidget.cpp
    │   │   └── screenwidget.h
    │   ├── coretime
    │   │   ├── alarm.cpp
    │   │   ├── alarm.h
    │   │   ├── coretime.cpp
    │   │   ├── coretime.h
    │   │   ├── coretime.ui
    │   │   ├── fileio.cpp
    │   │   ├── fileio.h
    │   │   ├── schedulecollection.cpp
    │   │   ├── schedulecollection.h
    │   │   ├── schedule.cpp
    │   │   ├── schedule.h
    │   │   ├── snooze.cpp
    │   │   ├── snooze.h
    │   │   ├── snooze.ui
    │   │   ├── timer.cpp
    │   │   └── timer.h
    │   ├── help
    │   │   ├── help.cpp
    │   │   ├── help.h
    │   │   └── help.ui
    │   ├── icons.qrc
    │   ├── main.cpp
    │   ├── other
    │   │   ├── background.png
    │   │   └── sound.ogg
    │   ├── other.qrc
    │   ├── README.md
    │   ├── search
    │   │   ├── search.cpp
    │   │   ├── search.h
    │   │   └── search.ui
    │   ├── settings
    │   │   ├── settings.cpp
    │   │   ├── settings.h
    │   │   ├── settingsmanage.cpp
    │   │   ├── settingsmanage.h
    │   │   └── settings.ui
    │   └── start
    │       ├── start.cpp
    │       ├── start.h
    │       └── start.ui
    ├── CoreBox.desktop
    ├── CoreBox.png
    ├── CoreBox.pro
    ├── docs
    │   ├── buildinfo.txt
    │   ├── ChangeLog
    │   ├── docs.qrc
    │   ├── PKGBUILD
    │   ├── ReleaseNotes
    │   ├── screenshots
    │   │   ├── a1.png
    │   │   ├── a2.png
    │   │   ├── a3.png
    │   │   └── a4.png
    │   └── To-Do.txt
    ├── LICENSE
    ├── README.md
    └── t.txt
    
    18 directories, 96 files
    
    

    so made a code with QDirIterator . here is the code

    QString dirItemToText::getFolderConts(const QString &path)
    {
    
        QString output;
    
        QString currentPath;
        QDirIterator it(path, QDir::AllEntries | QDir::System | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Hidden, QDirIterator::Subdirectories);
        while (it.hasNext()) {
            it.next();
            if(it.fileInfo().isDir()) {
                if (it.filePath() == path)
                    continue;
    
                currentPath = it.fileInfo().baseName();
                output += "├── " + it.fileInfo().baseName() + "\n";
            } else {
                if (it.fileInfo().baseName() == currentPath)
                    output += "│   ├── " + it.fileName() + "\n";
    
            }
        }
        qDebug () << output;
    
        QString filePath = "/home/shaber/y.txt";
    
        QFile file(filePath);
        file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate);
        QTextStream text(&file);
        text << output;
        file.close();
    }
    

    but the output is not like what i wanted
    my codes output is this and at l last couple of line i get some garbage

    │   ├── .travis.yml
    ├── app
    ├── start
    │   ├── start.cpp
    │   ├── start.h
    │   ├── start.ui
    ├── coreimage
    │   ├── coreimage.ui
    │   ├── coreimage.cpp
    │   ├── coreimage.h
    ├── settings
    │   ├── settings.h
    │   ├── settings.cpp
    │   ├── settings.ui
    ├── about
    │   ├── about.cpp
    │   ├── about.ui
    │   ├── about.h
    ├── help
    │   ├── help.h
    │   ├── help.cpp
    │   ├── help.ui
    ├── corepad
    │   ├── corepad.h
    │   ├── corepad.ui
    │   ├── corepad.cpp
    ├── corebox
    │   ├── corebox.cpp
    │   ├── corebox.ui
    │   ├── corebox.h
    ├── search
    │   ├── search.ui
    │   ├── search.h
    │   ├── search.cpp
    ├── corepdf
    │   ├── corepdf.h
    │   ├── corepdf.cpp
    ├── coretime
    │   ├── coretime.cpp
    │   ├── coretime.h
    │   ├── coretime.ui
    ├── coreaction
    │   ├── coreaction.h
    │   ├── coreaction.ui
    │   ├── coreaction.cpp
    ├── corescreenshot
    ├── coreplayer
    │   ├── coreplayer.cpp
    │   ├── coreplayer.ui
    │   ├── coreplayer.h
    ├── bookmarks
    │   ├── bookmarks.ui
    │   ├── bookmarks.h
    │   ├── bookmarks.cpp
    ├── other
    ├── docs
    ├── screenshots
    ├── 
    ├── branches
    ├── refs
    ├── heads
    ├── tags
    ├── remotes
    ├── origin
    ├── hooks
    ├── objects
    ├── 99
    ├── 73
    ├── bd
    ├── da
    ├── 9d
    ├── 2f
    ├── info
    ├── 26
    ├── 7f
    ├── 41
    ├── 74
    ├── 2b
    ├── 6c
    ├── 34
    ├── ff
    ├── pack
    ├── fd
    ├── 48
    ├── 3d
    ├── info
    ├── logs
    ├── refs
    ├── heads
    ├── remotes
    ├── origin
    
    

    i have no idea how to get output like the first one and why i am getting the garbage.
    also some time it crashes .
    please help.


  • Moderators

    @saber It can't work like this: the amount of indentations depends on the number of subdirectories relative to path. You now have fix indentations "|--" and "| |--".



  • @jsulm ok.
    but can't figure it out where to add another "| " in code.

    my head is exploding . please help!!!



  • @saber
    Do you know what recursion is? You are trying to walk an arbitrary-depth tree, outputting as you go along according to depth. Writing it recursively will result in less "head explosion" than trying to do it iteratively.



  • @JonB
    no idea .
    help with code please.
    i have to submit a project so i need this working.



  • can @mrjj help me? please


  • Lifetime Qt Champion

    @saber
    Sorry i have no idea how to get depth with QDirIterator and if you dont know what
    recursion is, then it will be hard to understand the code anyway.

    What about just calling linux tree command with QProcess and capture output ?
    alt text



  • @mrjj
    i know that way .but not every distro come with that pre-installed and also i got some problem with qt to capture output .here

    can you please review my code?
    i just know that i need to add another line if the folder has any item .but can't figure it how in code.
    it is important .it will really helpful if it is working.



  • nothing yet


  • Lifetime Qt Champion

    @saber
    Hi i dont know how to make it.
    Im not sure QDirIterator can say if any files in folder.
    As far as i know its one huge list.



  • @saber
    You need a recursive algorithm, no escape from this ...

    Get ride of QDirIterator::Subdirectories
    and call your method for each directory:

    if(it.fileInfo().isDir())
        getFolder(it.filePath()); // recursive call
    

    Extra work is needed for displaying the indentation symbols.
    -test if item is the last in this directory (├─ or └─ )
    -same test for directory item (add │ or space to the indentation string)
    -a way to retreive this indentation string over each recusive call.

    Not so hard, you can do it ;)



  • @mpergand said in help in QDirIterator to a text file:

    You need a recursive algorithm, no escape from this ...

    For the record, one can always write a recursive algorithm iteratively :) But as I suggested earlier OP would be better writing it recursively, as per your outline, to minimize brain-ache!



  • I created a function but don't know why whole app is crashing. Plz help on that...
    Code:

    QString getTree(const QString &path) {
    QDirIterator it(path, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::NoSymLinks);

    while (it.hasNext()) {
    it.next();
    if (it.fileInfo().isDir()) {
    qDebug() << it.fileInfo().path();
    getTree(it.filePath());
    }

    qDebug() << "\t" << it.filePath();
    }
    }



  • @Abrar
    while (it.hasNext) {

    I don't do C++, but shouldn't that be it.hasNext()?



  • You return nothing, that's the cause.

    @JonB
    Your're right ofcourse, in fact it doesn"t even compile.



  • @mpergand thanks a lot it's working



  • @JonB Yes you are right.
    That was my typing mistake.
    @mpergand it was compiling.



  • @Abrar
    Never type "your code", always copy & paste! That would save a fair proportion of questions/answers in the forum!



  • @JonB thanks for your suggestion.



  • @Abrar made a function that works .but problems is it takes a long time to make the text file (not enter every folder and get the name).it takes long time if the folder tree is complex.

    i wonder how the tree package that @mrjj pointing is take fraction of the time to make that same text file.

    here is the code.

    int pat = 0;
    QString strDir;
    QString getFileFolderTree(const QString &path)
    {
        
        // ├
    
        // └
    
        // │
    
        // ──
    
    
        pat++;
    
        QDir dir(path);
        //dir.setSorting(QDir::DirsFirst);
        //dir.setNameFilters(QStringList("*"));
        dir.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
        QStringList dList = dir.entryList();
        for (int i = 0; i < dList.count(); ++i) {
            QString newPath = QString("%1/%2").arg(dir.absolutePath()).arg(dList.at(i));
    
            QString strPat = "├── ";
            for (int i = 1; i < pat; i++) {
                strPat.insert(0, "│   ");
            }
    
            if (i == dList.count() - 1) {
                int pos = strPat.count() - 4;
                strPat = strPat.replace(pos, 1, "└");
            }
    
            strDir.append(strPat + QDir(dList.at(i)).dirName() + "\n");
    
            getFileFolderTree(newPath);
        }
    
        pat--;
    
        dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
        QStringList fList = dir.entryList();
        for (int i = 0; i < fList.count(); i++) {
    
            QString strPat = "├── ";
            for (int j = 1; j < pat + 1; j++) {
                strPat.insert(0, "│   ");
            }
    
            if (i == fList.count() - 1) {
                strPat = strPat.replace(strPat.count() - 4, 1, "└");
            }
    
            strDir.append(strPat + fList[i] + "\n");
        }
    
    //    QDirIterator it(path, QDir::AllEntries | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::System);
    //    while (it.hasNext()) {
    //        it.next();
    //        if (it.fileInfo().isDir()) {
    //            qDebug() << it.fileInfo().path();
    //            getFileFolderTree(it.filePath());
    //        }
    //        qDebug() << "\t" << it.filePath();
    //    }
    
        //qDebug() << strDir;
    
        if (!strDir.count())
            strDir.append(".\n");
    
        QFile file("/home/abrar/Desktop/UI.txt");
        file.open(QIODevice::Text | QIODevice::ReadWrite | QIODevice::Truncate);
        QTextStream out(&file);
        out << strDir;
        file.close();
    
    
        return QString();
    }
    
    

    so i need some help to dicress the time to make the text file .
    help! help! help!
    thanks.



  • @saber
    It shouldn't take long. But you don't say how many files/directories there are --- if it's thousands, it will take longer....

    You should put debug statements in or run under debugger to discover just which part is taking the time if you expect anybody to be able to help you. Saying "help! help! help!" doesn't do it.



  • @JonB
    thanks.
    as in my Linux system debuger is not working (i tried to fix), i can't test it.


  • Moderators

    @saber You still can put some debug output in your code as @JonB suggested



  • @saber
    If you mean your gdb is not working you should get it working.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.