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

如何检测硬盘是否正在旋转(在Windows下)?,windows,winapi,hard-drive,Windows,Winapi,Hard Drive,如何通过编程确定硬盘当前是否正在旋转(Windows 7或更高版本) 我尝试了GetDevicePowerState(),但对于我知道当前未旋转的驱动器(内部和USB驱动器),它总是返回TRUE(始终为1,而不是另一个非零值)。在GetDevicePowerState()返回TRUE之后,如果我在控制台中发出dir d:,我会立即听到驱动器旋转,并且在生成目录列表之前会有几秒钟的延迟 我的代码需要检查驱动器上是否存在目录。如果驱动器当前已关闭,则可以推迟或跳过检查。我希望避免对降速驱动器进行检查

如何通过编程确定硬盘当前是否正在旋转(Windows 7或更高版本)

我尝试了
GetDevicePowerState()
,但对于我知道当前未旋转的驱动器(内部和USB驱动器),它总是返回
TRUE
(始终为1,而不是另一个非零值)。在
GetDevicePowerState()
返回
TRUE
之后,如果我在控制台中发出
dir d:
,我会立即听到驱动器旋转,并且在生成目录列表之前会有几秒钟的延迟

我的代码需要检查驱动器上是否存在目录。如果驱动器当前已关闭,则可以推迟或跳过检查。我希望避免对降速驱动器进行检查,原因有2个: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);
   }
}
for(int-DriveNumber=0;DriveNumber<128;++DriveNumber){
TCHAR驱动[128];
_stprintf(驱动器,\u T(“\\.\\PHYSICALDRIVE%d”)、驱动器号;
HANDLE hDevice=CreateFile(驱动器,0,文件共享读取,文件共享写入,0,打开现有,0,0);
if(hDevice!=无效的句柄值){
BOOL DeviceIsOn=FALSE;
if(getDevicePower状态(hDevice和DeviceIsOn)!=0){
_tprintf(\u T(“物理驱动器%d已通电%s(设备=%d)\n”)、驱动器号、设备号?\u T(“打开”):\u T(“关闭”)、(int)设备号;
}
闭合手柄(hDevice);
}
}

正如我想说的,不要告诉我这个bug,告诉我你想完成什么

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

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


听听“呼呼”的声音。这很有效,只是我没有安装人脑接口API:-)通过发送ATA_OP_CHECKPOWERMODE ioctl.Damon查看hdparm的源代码-谢谢。DeviceIoControl方法对ATA驱动器很好,但对USB驱动器似乎不起作用。还有其他想法吗?
GetDevicePowerState
就是这样做的。请注意,对于
驱动器\u固定的
类型驱动器,您必须使用物理驱动器的句柄(
“\\.\PhysicalDriveX”
)而不是驱动器号。