如何以编程方式确定硬盘驱动器当前是否正在旋转(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);
}
}
答案 0 :(得分:1)
正如我想说的那样,不要告诉我这个错误 - 告诉我你想要完成的事情。
我的代码需要检查驱动器上的目录是否存在
好的,如果这是最终目标,Windows会为名为FindFirstChangeNotification的API提供API。您可以使用更改通知API来启动线程并监视文件或目录何时更改。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365261(v=vs.85).aspx