Спасибо всем! Реализовал оба варианта: и через 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;
}
вариант с API:
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;
}
Вариант с заранее созданным списком:
В конструкторе класса или в ф-ии update:
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;
}