Пересекающиеся каталоги и их подкаталоги - PullRequest
0 голосов
/ 06 июля 2018

Я пересекаю каталоги и их подкаталоги, используя этот фрагмент кода. Я делаю это для того, чтобы получить путь только одного случайного файла из каждого конечного подкаталога и перейти к следующему конечному подкаталогу. Но в моей реализации он перебирает все файлы в конечных подкаталогах.

Например, из каталога /cars/bmw/model1/ достаточно получить только /cars/bmw/model1/f.png путь.

QDirIterator it(selectedReferenceFullDirectory, QDir::Files, QDirIterator::Subdirectories);

    while(it.hasNext())
    {
     ...
    }

Мои подкаталоги похожи на:

/cars/bmw/model1/h.png
/cars/bmw/model1/f.png
/cars/bmw/model2/q.png
/cars/bmw/model1/hb/a.png
/cars/bmw/model1/sed/y.png
/cars/audi/model2/sed/y.png
...

Итак, нет определенного количества подкаталогов. Так как внутри каталогов тонны фотографий, пока цикл занимает много времени. Есть ли у вас идеи улучшить производительность? Спасибо заранее

1 Ответ

0 голосов
/ 06 июля 2018

Я предлагаю выполнять итерации не по всем файлам, а только по подкаталогам. Для каждого каталога достаточно взять один файл (случайным образом). Вот как я бы это сделал (простейшее решение):

QStringList randomFiles(const QString &path)
{
  QDirIterator it(path, QDir::AllDirs | QDir::NoDotAndDotDot,
                  QDirIterator::Subdirectories);
  QStringList filePaths;
  while (it.hasNext())
  {
    it.next();

    QDir dir(it.filePath());
    auto files = dir.entryInfoList(QDir::Files);
    if (files.size() > 0)
    {
      // Take the first file from each directory.
      // This might be a random file too, though.
      filePaths.append(files.at(0).absoluteFilePath());
    }
  }
  return filePaths;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...