KL
Наурыз 31, 2017, 12:21 Т.Ж.

Поиск строки в папке с файлами.

Добрый вечер. Подскажите как мне написать программу поиска строки в файлах папки. Файлы с разным разрешением.

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

11
Evgenii Legotckoi
  • Наурыз 31, 2017, 10:30 Т.Ж.
  • Жауап шешім ретінде белгіленді.

Добрый день.
Если подразумевался поиск строки внутри файла, то можно сделать так:

QDir dir("/path/to/folder/FOLDER");

if (dir.exists())
{
    // Ищем даже по скрытым файлам
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Name);    // Сортируем
    // Забираем список всех файлов в папке
    // НО не учитываются файлы во вложенных папках, нужно делать рекурсивный поиск
    QFileInfoList list = dir.entryInfoList();
    
    // Перебираем все файлы
    for (QFileInfo fileInfo : list)
    {
        QFile file(fileInfo.absoluteFilePath());
        // Если файл существует
        if (file.exists())
        {
            // то открываем его
            if (file.open(QIODevice::ReadOnly))
            {
                // Считываем файл построчно
                while(!file.atEnd())
                {
                    QString currentString = QString(file.readLine());
                   // Ищем вхождение требуемой строки в текущую строку файла
                    if (currentString.contains("I try find this stroke"))
                    {
                        qDebug() << "FOUNDED";
                    }
                }
            }
            file.close();
        }
    }
}

Идея такая, можете добавить QVector или QMap для хранения найденных строк и счётчики для номера строки.

    KL
    • Сәуір 1, 2017, 1:59 Т.Қ.

    В QT есть класс по управлению выбора файла. Как выбор цвета в отдельном окне, только с файлами. Подскажите его название и как узнать путь выбранного в нем файла.

      Evgenii Legotckoi
      • Сәуір 1, 2017, 2:14 Т.Қ.

      Для этого используется QFileDialog :

      QString fileName = QFileDialog::getOpenFileName(this,             // Устанавливаем parent
                                                      tr("Open File"),  // Устанавливаем заголовок
                                                      "/home",          // Устанавливаем стартовую папку
                                                      tr("Images (*.png *.xpm *.jpg)"));    // Устанавливаем расширения файлов, которые ищем
        KL
        • Сәуір 1, 2017, 2:31 Т.Қ.

        (QFileInfo fileInfo:list)При сборке ругается на эту строку.

          KL
          • Сәуір 1, 2017, 7:24 Т.Қ.

          Ребята, что делать с (QFileInfo fileInfo:list)

            Evgenii Legotckoi
            • Сәуір 1, 2017, 8:20 Т.Қ.

            Хорошо, ругается. Как ругается? Что пишет в ошибке?

              KL
              • Сәуір 1, 2017, 8:33 Т.Қ.

              C:\Users\user\Documents\Found\mainwindow.cpp:35: ошибка: range-based 'for' loops are not allowed in C++98 mode for (QFileInfo fileInfo : list) ^

                Evgenii Legotckoi
                • Сәуір 1, 2017, 8:39 Т.Қ.

                Ох тыж ёжик. 0_о По какой такой странной причине вы используете стандарт C++98?

                for (QFileInfo fileInfo : list) - это запись перебора элементов контейнера из стандарта C++11.

                Если у вас нет веских причин использовать C++98, то покопайтесь в настройках и настройте проект на использование C++11. В противном случае перепишите с использованием макроса foreach :

                foreach (QFileInfo fileInfo, list)

                  KL
                  • Сәуір 1, 2017, 8:41 Т.Қ.

                  Благодарю, заработало.

                    KL
                    • Сәуір 2, 2017, 10:38 Т.Қ.

                    QFileDialog Как открыть папку? Получается открыть только файл.

                      Evgenii Legotckoi
                      • Сәуір 2, 2017, 10:43 Т.Қ.

                      Использовать метод getExistingDirectory вместо getOpenFileName

                      QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
                                                                      "/home",
                                                                      QFileDialog::ShowDirsOnly
                                                                      | QFileDialog::DontResolveSymlinks);

                        Пікірлер

                        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                        Кіріңіз немесе Тіркеліңіз