我正在使用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

本文关键字:运行 错误 一直 exe Creator QDir isReadable 是否 驱动器 检查 Qt      更新时间:2023-10-16

我是这样使用的:

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

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

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

"驱动器中没有磁盘。"请把磁盘插入G盘。"

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

编辑:我认为这是导致问题的isReadable函数,还有其他方法来做我想做的吗?或者我应该自己写代码?

此消息由Windows生成。

对于有无法修复的应用程序的用户,有一个解决方案。通过在

中设置2为注册表项ErrorMode,可以抑制错误消息。
ComputerHKEY_LOCALMACHINESYSTEMCurrentControlSetControlWindows

看起来,如果QDir::isReadable()在删除媒体后被调用,它会触发该错误。如果驱动器号在系统中存在,QDir::exists()总是返回true,所以它不能在这里使用。

现在我看到可以使用本机Windows API检查可移动媒体,请参阅如何检测媒体是否插入可移动驱动器/读卡器

下面的代码能够检测到媒体被删除而不触发错误:

#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
}