簡體   English   中英

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

“驅動器中沒有磁盤。請將磁盤插入驅動器G:。”

我不希望這個錯誤繼續出現,我該怎么辦?

編輯:我認為這是導致問題的isReadable函數,有沒有其他方法可以做我想做的事情? 或者我應該自己編寫代碼?

此消息由Windows生成。

對於具有無法修復的應用程序的用戶,有一種解決方法。 通過將注冊表項ErrorMode設置為2 ,可以抑制錯誤消息:

Computer\HKEY_LOCAL\MACHINE\SYSTEM\CurrentControlSet\Control\Windows

看起來,如果在刪除媒體后調用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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM