簡體   English   中英

如何檢測硬盤驅動器是否正在旋轉(在Windows下)?

[英]How can I detect if a hard drive is spinning (under Windows)?

如何以編程方式確定硬盤驅動器當前是否正在旋轉(Windows 7或更高版本)?

我嘗試了GetDevicePowerState()但它總是為我知道當前沒有旋轉的驅動器(對於內部和USB驅動器)返回TRUE (總是1,而不是另一個非零值)。 GetDevicePowerState()返回TRUE ,如果我在控制台中發出dir d: :,我聽到驅動器旋轉,並且在生成目錄列表之前有幾秒鍾的延遲。

我的代碼需要檢查驅動器上的目錄是否存在。 如果驅動器當前停止運轉,則可以延遲或跳過檢查。 我想避免對旋轉驅動器進行檢查有兩個原因:1)檢查當前是同步完成的,我不希望用戶必須等待驅動器旋轉2)我不想導致驅動器旋轉只是為了進行檢查(希望很明顯為什么不這樣做)。

有沒有辦法做到這一點?

根據評論更新:

有人建議GetDevicePowerState使用物理設備名稱但我不能讓它返回除1之外的任何內容(同樣,對於我已經驗證的驅動器不旋轉)。 以下是我正在使用的代碼。 如果確實知道GetDevicePowerState可以使用USB驅動器,那么我對CreateFile參數可能有問題嗎?

for (int DriveNumber = 0; DriveNumber < 128; ++DriveNumber) {
   TCHAR Drive[128];
   _stprintf (Drive, _T("\\\\.\\PHYSICALDRIVE%d"), DriveNumber);
   HANDLE hDevice = CreateFile(Drive, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
   if (hDevice != INVALID_HANDLE_VALUE) {
      BOOL DeviceIsOn = FALSE;
      if (GetDevicePowerState(hDevice, &DeviceIsOn) != 0) {
         _tprintf(_T("Physical Drive %d is Powered %s (DeviceIsOn=%d)\n"), DriveNumber, DeviceIsOn?_T("On"):_T("Off"), (int)DeviceIsOn);
      }
      CloseHandle(hDevice);
   }
}

正如我想說的那樣,不要告訴我這個錯誤 - 告訴我你想要完成什么。

我的代碼需要檢查驅動器上的目錄是否存在

好的,如果這是最終目標,Windows會為名為FindFirstChangeNotification的API提供API。 您可以使用更改通知API來啟動線程並監視文件或目錄何時更改。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx

暫無
暫無

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

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