代码之家  ›  专栏  ›  技术社区  ›  Jonx

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

  •  8
  • Jonx  · 技术社区  · 15 年前

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

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

    谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  6
  •   sean e    15 年前

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

    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;
    }
    
        2
  •  4
  •   Michael9000    13 年前

    在C#中(从 http://msdn.microsoft.com/en-us/library/ms704147.aspx )

    // 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;
    }