diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-09-25 10:27:55 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-09-29 19:45:40 +0000 |
commit | 69e68218e5082166d5c4ab1903fbacde00418a1c (patch) | |
tree | 2e375b5b4b0280ed147d21ea35c2a465ceb9749d /src/corelib | |
parent | 364d3da3d5cce9a19b06b4fca04a91a0238248e3 (diff) |
Windows: Fix QDir::drives() to no longer list ejected media
Add a check using GetVolumeInformation() (modeled after QStorageInfo::ready)
within a SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX scope.
Remove old #ifdef used for Windows CE.
[ChangeLog][QtCore][QDir] On Windows, QDir::drives() no longer
returns drives whose media were ejected.
Fixes: QTBUG-69029
Change-Id: I2d4a32e9281ccf3c0f2ebfa427122609aa4f327f
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/io/qfsfileengine_win.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index c1b8f00b4a..19cc3e6402 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -545,23 +545,33 @@ QString QFSFileEngine::tempPath() return QFileSystemEngine::tempPath(); } +#if !defined(Q_OS_WINRT) +// cf QStorageInfo::isReady +static inline bool isDriveReady(const wchar_t *path) +{ + DWORD fileSystemFlags; + const UINT driveType = GetDriveType(path); + return (driveType != DRIVE_REMOVABLE && driveType != DRIVE_CDROM) + || GetVolumeInformation(path, nullptr, 0, nullptr, nullptr, + &fileSystemFlags, nullptr, 0) == TRUE; +} +#endif // !Q_OS_WINRT + QFileInfoList QFSFileEngine::drives() { QFileInfoList ret; #if !defined(Q_OS_WINRT) -# if defined(Q_OS_WIN32) const UINT oldErrorMode = ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); quint32 driveBits = (quint32) GetLogicalDrives() & 0x3ffffff; - ::SetErrorMode(oldErrorMode); -# endif - char driveName[] = "A:/"; + wchar_t driveName[] = L"A:\\"; while (driveBits) { - if (driveBits & 1) - ret.append(QFileInfo(QLatin1String(driveName))); + if ((driveBits & 1) && isDriveReady(driveName)) + ret.append(QFileInfo(QString::fromWCharArray(driveName))); driveName[0]++; driveBits = driveBits >> 1; } + ::SetErrorMode(oldErrorMode); return ret; #else // !Q_OS_WINRT ret.append(QFileInfo(QLatin1String("/"))); |