如何检测硬盘驱动器是否正在旋转(在Windows下)?

时间:2014-03-11 18:33:17

标签: windows winapi hard-drive

如何以编程方式确定硬盘驱动器当前是否正在旋转(Windows 7或更高版本)?

我尝试了GetDevicePowerState()但它总是返回TRUE(总是1,而不是另一个非零值),我知道当前没有旋转的驱动器(内部和USB驱动器)。在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);
   }
}

1 个答案:

答案 0 :(得分:1)

正如我想说的那样,不要告诉我这个错误 - 告诉我你想要完成的事情。

  

我的代码需要检查驱动器上的目录是否存在

好的,如果这是最终目标,Windows会为名为FindFirstChangeNotification的API提供API。您可以使用更改通知API来启动线程并监视文件或目录何时更改。

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