我正在使用 QDir().isReadable 来检查驱动器是否可读。在 Qt Creator 中它 运行 很好,但是当我 运行 exe 时它一直给我错误

I'm using QDir().isReadable to check if a drive is readable. In the Qt Creator it runs fine, but when I run the exe it keeps giving me errors

我是这样使用的:

if(QDir("G:/").isReadable()){
    qDebug("G Is readable!"); //Do something with G:/
}

正如我所说,在 Qt Creator 中它 运行 没问题,它检查驱动器是否可读,如果是,它会将它打印到控制台,如果不是,它什么都不做。

但是当我 运行 .exe 文件时,如果驱动器不可读,它每次检查(每 2 秒)时都会给我错误。

"There is no disk in the drive. Please insert a disk into drive G:."

我不想让这个错误一直出现,我该怎么办?

编辑:我认为是 isReadable 函数导致了问题,还有其他方法可以完成我想做的事情吗?或者我应该自己写代码?

此消息由 Windows 生成。

对于拥有无法修复的应用程序的用户,有一个解决方法。可以通过将 2 设置为注册表项 ErrorMode in:

来抑制错误消息
Computer\HKEY_LOCAL\MACHINE\SYSTEM\CurrentControlSet\Control\Windows

看起来,如果在删除媒体后调用 QDir::isReadable(),它会触发该错误。 QDir::exists()总是returnstrue如果盘符存在于系统中,所以不能在这里使用。

现在我看到可以使用本机 Windows API 检查可移动媒体,请参阅 How to detect if media is inserted into a removable drive/card reader

的答案

以下代码能够检测到媒体已被移除而不会触发错误:

#include <windows.h>

HANDLE hDevice = CreateFile (L"\\.\G:",         // like "\.\G:"
                             FILE_READ_ATTRIBUTES, // read access to the attributes
                             FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                             NULL, OPEN_EXISTING, 0, NULL);

if (hDevice == INVALID_HANDLE_VALUE) {
    // not valid device
    return;
}

WORD cbBytesReturned;
bool bSuccess = DeviceIoControl (hDevice,                // device to be queried
                            IOCTL_STORAGE_CHECK_VERIFY2,
                            NULL, 0,                     // no input buffer
                            NULL, 0,                     // no output buffer
                            (LPDWORD)&cbBytesReturned,   // # bytes returned
                            NULL);                       // synchronous I/O

CloseHandle(hDevice); // close handle

if (bSuccess && QDir("G:/").isReadable()) {
    // G is readable
}