Какова реализация QDir::count()

По всему интернету кажется, что общепринятым способом подсчета количества дочерних элементов каталога является циклический просмотр его записей вручную и их подсчет. Это кажется слишком утомительным, и, как правило, существуют другие платформы и API, которые предлагают удобную функцию для получения количества дочерних элементов, одной из которых является QDir::count().

Существует ли POSIX API, который эффективно возвращает количество записей в каталоге? Если это так, я бы предположил, что это реализация QDir::count(). Если нет, то, возможно, это сделано так, как это делают многие люди, просматривая записи и подсчитывая их, если они уместны.

1 ответ

Решение

Внутренне QDir перебирает каталог, читая записи в списке. QDir::count() возвращает количество записей в этом списке (count() будет заполнять список, если это еще не произошло).

Увидеть qtbase/src/corelib/io/qdir.cpp для реализации

  • QDir::count():

    uint QDir::count() const
    {
        const QDirPrivate* d = d_ptr.constData();
        d->initFileLists(*this);
        return d->files.count();
    }
    
  • QDirPrivate::initFileLists():

    inline void QDirPrivate::initFileLists(const QDir &dir) const
    {
        if (!fileListsInitialized) {
            QFileInfoList l;
            QDirIterator it(dir);
            while (it.hasNext()) {
                it.next();
                l.append(it.fileInfo());
            }
            sortFileList(sort, l, &files, &fileInfos);
            fileListsInitialized = true;
        }
    }
    
Другие вопросы по тегам