Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. help in QDirIterator to a text file
Forum Updated to NodeBB v4.3 + New Features

help in QDirIterator to a text file

Scheduled Pinned Locked Moved Unsolved General and Desktop
24 Posts 6 Posters 4.5k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S saber

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

    my head is exploding . please help!!!

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by
    #4

    @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.

    S 1 Reply Last reply
    4
    • JonBJ JonB

      @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.

      S Offline
      S Offline
      saber
      wrote on last edited by
      #5

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

      1 Reply Last reply
      0
      • S Offline
        S Offline
        saber
        wrote on last edited by saber
        #6

        can @mrjj help me? please

        mrjjM 1 Reply Last reply
        0
        • S saber

          can @mrjj help me? please

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #7

          @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

          S 1 Reply Last reply
          1
          • mrjjM mrjj

            @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

            S Offline
            S Offline
            saber
            wrote on last edited by saber
            #8

            @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.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              saber
              wrote on last edited by
              #9

              nothing yet

              mrjjM M 2 Replies Last reply
              0
              • S saber

                nothing yet

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #10

                @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.

                1 Reply Last reply
                0
                • S saber

                  nothing yet

                  M Offline
                  M Offline
                  mpergand
                  wrote on last edited by
                  #11

                  @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 ;)

                  JonBJ 1 Reply Last reply
                  5
                  • M mpergand

                    @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 ;)

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by
                    #12

                    @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!

                    1 Reply Last reply
                    1
                    • AbrarA Offline
                      AbrarA Offline
                      Abrar
                      wrote on last edited by Abrar
                      #13

                      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();
                      }
                      }

                      JonBJ 1 Reply Last reply
                      0
                      • AbrarA Abrar

                        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();
                        }
                        }

                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by
                        #14

                        @Abrar
                        while (it.hasNext) {

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

                        AbrarA 1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          mpergand
                          wrote on last edited by mpergand
                          #15

                          You return nothing, that's the cause.

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

                          AbrarA 1 Reply Last reply
                          1
                          • M mpergand

                            You return nothing, that's the cause.

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

                            AbrarA Offline
                            AbrarA Offline
                            Abrar
                            wrote on last edited by
                            #16

                            @mpergand thanks a lot it's working

                            1 Reply Last reply
                            0
                            • JonBJ JonB

                              @Abrar
                              while (it.hasNext) {

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

                              AbrarA Offline
                              AbrarA Offline
                              Abrar
                              wrote on last edited by
                              #17

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

                              JonBJ 1 Reply Last reply
                              0
                              • AbrarA Abrar

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

                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by JonB
                                #18

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

                                AbrarA 1 Reply Last reply
                                1
                                • JonBJ JonB

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

                                  AbrarA Offline
                                  AbrarA Offline
                                  Abrar
                                  wrote on last edited by
                                  #19

                                  @JonB thanks for your suggestion.

                                  1 Reply Last reply
                                  0
                                  • S Offline
                                    S Offline
                                    saber
                                    wrote on last edited by saber
                                    #20

                                    @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.

                                    JonBJ 1 Reply Last reply
                                    0
                                    • S saber

                                      @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.

                                      JonBJ Offline
                                      JonBJ Offline
                                      JonB
                                      wrote on last edited by
                                      #21

                                      @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.

                                      S 1 Reply Last reply
                                      1
                                      • JonBJ JonB

                                        @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.

                                        S Offline
                                        S Offline
                                        saber
                                        wrote on last edited by
                                        #22

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

                                        jsulmJ JonBJ 2 Replies Last reply
                                        0
                                        • S saber

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

                                          jsulmJ Offline
                                          jsulmJ Offline
                                          jsulm
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #23

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

                                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved