[英]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.