如何检测硬盘驱动器是否正在旋转(在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);
   }
}
正如我想说的那样,不要告诉我这个错误 – 告诉我你要完成什么.

My code needs to check if a directory on a drive exists

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

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

相关文章
相关标签/搜索