--- a/src/corelib/io/qfilesystemengine_win.cpp +++ b/src/corelib/io/qfilesystemengine_win.cpp @@ -860,14 +860,19 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM WIN32_FIND_DATA findData; // The memory structure for WIN32_FIND_DATA is same as WIN32_FILE_ATTRIBUTE_DATA // for all members used by fillFindData(). - bool ok = ::GetFileAttributesEx((wchar_t*)fname.nativeFilePath().utf16(), GetFileExInfoStandard, - reinterpret_cast(&findData)); - if (ok) { - data.fillFromFindData(findData, false, fname.isDriveRoot()); + + DWORD fileAttrib; + bool ok = false; + if (ok = getFindData(fname.nativeFilePath(), findData)) { + fileAttrib = findData.dwFileAttributes; + if (fileAttrib != INVALID_FILE_ATTRIBUTES) + data.fillFromFindData(findData, true, fname.isDriveRoot()); } else { - if (!tryFindFallback(fname, data)) - tryDriveUNCFallback(fname, data); + ok = tryDriveUNCFallback(fname, data); } + if (!ok) + ::GetFileAttributesEx((wchar_t*)fname.nativeFilePath().utf16(), GetFileExInfoStandard, + reinterpret_cast(&findData)); SetErrorMode(oldmode); } @@ -921,15 +926,12 @@ static bool isDirPath(const QString &dirPath, bool *existed) if (path.length() == 2 && path.at(1) == QLatin1Char(':')) path += QLatin1Char('\\'); - DWORD fileAttrib = ::GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16()); - if (fileAttrib == INVALID_FILE_ATTRIBUTES) { - int errorCode = GetLastError(); - if (errorCode == ERROR_ACCESS_DENIED || errorCode == ERROR_SHARING_VIOLATION) { - WIN32_FIND_DATA findData; - if (getFindData(QFSFileEnginePrivate::longFileName(path), findData)) - fileAttrib = findData.dwFileAttributes; - } - } + DWORD fileAttrib; + WIN32_FIND_DATA findData; + if (getFindData(QFSFileEnginePrivate::longFileName(path), findData)) + fileAttrib = findData.dwFileAttributes; + if (fileAttrib == INVALID_FILE_ATTRIBUTES) + fileAttrib = ::GetFileAttributes((wchar_t*)QFSFileEnginePrivate::longFileName(path).utf16()); if (existed) *existed = fileAttrib != INVALID_FILE_ATTRIBUTES; --- a/src/gui/dialogs/qfileinfogatherer.cpp +++ b/src/gui/dialogs/qfileinfogatherer.cpp @@ -316,14 +316,23 @@ void QFileInfoGatherer::getFileInfos(const QString &path, const QStringList &fil QStringList filesToCheck = files; QString itPath = QDir::fromNativeSeparators(files.isEmpty() ? path : QLatin1String("")); - QDirIterator dirIt(itPath, QDir::AllEntries | QDir::System | QDir::Hidden); + QDirIterator dirIt(itPath, QDir::Dirs | QDir::System | QDir::Hidden); QStringList allFiles; - while(!abort && dirIt.hasNext()) { + // Dirs first and then files (to save sorting time) + while(!abort && dirIt.hasNext()) { dirIt.next(); fileInfo = dirIt.fileInfo(); allFiles.append(fileInfo.fileName()); - fetch(fileInfo, base, firstTime, updatedFiles, path); + fetch(fileInfo, base, firstTime, updatedFiles, path); } + QDirIterator dirItFiles(itPath, QDir::Files | QDir::System | QDir::Hidden); + while(!abort && dirItFiles.hasNext()) { + dirItFiles.next(); + fileInfo = dirItFiles.fileInfo(); + allFiles.append(fileInfo.fileName()); + fetch(fileInfo, base, firstTime, updatedFiles, path); + } + if (!allFiles.isEmpty()) emit newListOfFiles(path, allFiles); @@ -342,7 +351,7 @@ void QFileInfoGatherer::fetch(const QFileInfo &fileInfo, QElapsedTimer &base, bo updatedFiles.append(QPair(fileInfo.fileName(), fileInfo)); QElapsedTimer current; current.start(); - if ((firstTime && updatedFiles.count() > 100) || base.msecsTo(current) > 1000) {