В программе требуется для заполнения таблицы многократно в цикле вызывать QDir.entryList(const QStringList & nameFilters) с разными масками файлов. Это требуется для определения числа файлов по определенной маске. Выполнение всего цикла занимает неоправданно много времени (если закомментировать строку с QDir.entryList() , то цикл проходит мгновенно). Подскажите, как ускорить entryList или если для определения числа файлов по определенной маске пользоваться другим классом ( функцией), то каким?
PS. раньше в в аналогичной программе, под С++Builder, пользовался FindFirst, FindNext все работало очень быстро.
Где-то в блогах Qt, или еще где-то, не помню, писалось про тормозливость QDir.entryList(const QStringList & nameFilters). Насколько я понял(прочтя ту статью), что если нужна интенсивная работа с этим методом, то лучше написать свой метот, используя API системы. Позже, тоже не помню где, вычитал, что исправили этот недочет.
Попробуй версию 4.6, там должны быть улучшения по этому поводу.
Тогда не entryList, а entryInfoList.
Спасибо всем! Реализовал оба варианта: и через API функции, и через заранее созданный список. Оба работают приемлемо быстро. Скачал Qt4.6 Beta1, установлю, попробую, отпишусь, исправили ли.
Программу интересуют файлы в директории следующего формата: "??????.??";
Исходный вариант ф-ии:
int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
int retVal = 0;
QStringList list(mask);
QStringList listFiles = dir.entryList(list,QDir::Files);
retVal = listFiles.count();
return retVal;
}
int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
int retVal = 0;
#ifdef Q_WS_WIN
QString dirName = directory.absolutePath()+"/"+mask;
WIN32_FIND_DATAA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[MAX_PATH]; // directory specification
qstrcpy(DirSpec,dirName.toLatin1().constData());
hFind = ::FindFirstFileA(&DirSpec[0], &FindFileData);
if (hFind != INVALID_HANDLE_VALUE)
do
{
retVal++;
} while (::FindNextFileA(hFind, &FindFileData) != 0);
::FindClose(hFind);
#else
<< как в предыдущей ф-ии
#endif
return retVal;
}
QStringList mask("??????.??");
m_fileList = dir.entryList(mask,QDir::Files);
int FileTables::getNumFiles(const QString &mask, const QDir &directory)
{
int retVal = 0;
bool ok;
int cnt = m_fileList.count();
for (int i=0; i<cnt; i++)
{
ok = true;
for (int j=0; j<9; j++)
{
if ( (mask[j]=='?') || (mask[j]=='.') ) continue;
if ( mask[j] != m_fileList[i][j]) {ok = false; break;}
}
if (ok) retVal++;
}
return retVal;
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)