我正在构建一个小应用程序,它为我提供了磁盘上的可用空间。
我想添加一个显示磁盘状态的功能,例如,如果它处于休眠状态。操作系统是Windows。
如何做到这一点?当然,代码不应该唤醒磁盘以找出;)
C#中的解决方案会很好但我想任何解决方案都可以......
谢谢你的帮助。
答案 0 :(得分:6)
C ++解决方案(调用GetDiskPowerState,它将遍历物理驱动器,直到没有更多):
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;
}
答案 1 :(得分:3)
在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;
}