C# 根据代码,如何在不唤醒硬盘驱动器的情况下测试硬盘驱动器是否处于休眠状态

C# 根据代码,如何在不唤醒硬盘驱动器的情况下测试硬盘驱动器是否处于休眠状态,c#,windows,hardware,C#,Windows,Hardware,我正在开发一个小应用程序,它可以为我提供磁盘上的可用空间 我想添加一个显示磁盘状态的功能,例如,它是否处于睡眠状态。操作系统是Windows 如何做到这一点?当然,代码不必唤醒磁盘才能发现;) 用C#的解决方案会很好,但我想任何解决方案都可以 感谢您的帮助。C++解决方案(调用GetDiskPowerState,它将在物理驱动器上迭代,直到没有更多): 在C#中(从) 是的,很好。。。您缺少导入,但链接提供了所有内容。谢谢 class AutoHandle { HANDLE mHand

我正在开发一个小应用程序,它可以为我提供磁盘上的可用空间

我想添加一个显示磁盘状态的功能,例如,它是否处于睡眠状态。操作系统是Windows

如何做到这一点?当然,代码不必唤醒磁盘才能发现;)

用C#的解决方案会很好,但我想任何解决方案都可以

感谢您的帮助。

C++解决方案(调用GetDiskPowerState,它将在物理驱动器上迭代,直到没有更多):

在C#中(从)


是的,很好。。。您缺少导入,但链接提供了所有内容。谢谢
class AutoHandle
{
    HANDLE  mHandle;
public:
    AutoHandle() : mHandle(NULL) { }
    AutoHandle(HANDLE h) : mHandle(h) { }

    HANDLE * operator & ()
    {
        return &mHandle;
    }

    operator HANDLE() const
    {
        return mHandle;
    }

    ~AutoHandle()
    {
        if (mHandle && mHandle != INVALID_HANDLE_VALUE)
            ::CloseHandle(mHandle);
    }
};


bool
GetDiskPowerState(LPCTSTR disk, string & txt)
{
    AutoHandle hFile = CreateFile(disk, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if (hFile && hFile != INVALID_HANDLE_VALUE)
    {
        BOOL powerState = FALSE;
        const BOOL result = GetDevicePowerState(hFile, &powerState);
        const DWORD err = GetLastError();

        if (result)
        {
            if (powerState)
            {
                txt += disk;
                txt += " : powered up\r\n";
            }
            else
            {
                txt += disk;
                txt += " : sleeping\r\n";
            }
            return true;
        }
        else
        {
            txt += "Cannot get drive ";
            txt += disk;
            txt += "status\r\n";
            return false;
        }
    }

    return false;
}

string 
GetDiskPowerState()
{
    string text;
    CString driveName;
    bool result = true;
    for (int idx= 0; result; idx++)
    {
        driveName.Format("\\\\.\\PhysicalDrive%d", idx);
        result = GetDiskPowerState(driveName, text);
    }
    return text;
}
// Get the power state of a harddisk
string ReportDiskStatus()
{
    string status = string.Empty;
    bool fOn = false;

    Assembly assembly = Assembly.GetExecutingAssembly();
    FileStream[] files = assembly.GetFiles();
    if (files.Length > 0)
    {
        IntPtr hFile = files[0].Handle;
        bool result = GetDevicePowerState(hFile, out fOn);
        if (result)
        {
            if (fOn)
            {
                status = "Disk is powered up and spinning";
            }
            else
            {
                status = "Disk is sleeping";
            }
        }
        else
        {
            status = "Cannot get Disk Status";
        }
        Console.WriteLine(status);
    }
    return status;
}