在没有在硬盘上写任何文件的情况下,C#检查硬盘是否是SSD的最简单方法是什么?

时间:2012-12-05 15:23:02

标签: c# .net hardware hard-drive

我需要检查C#,如果硬盘是SSD(固态硬盘),没有寻求惩罚? 我用过:

    ManagementClass driveClass = new ManagementClass("Win32_DiskDrive");
    ManagementObjectCollection drives = driveClass.GetInstances(); 

但是它只提供了属性中包含SSD的字符串,我不能依赖它?

我需要直接检查一下吗?

2 个答案:

答案 0 :(得分:9)

WMI无法轻易确定这一点。这里有一个解决方案,它基于Windows 7用于确定磁盘是否为SSD的相同算法(更多关于此处的算法:Windows 7 Enhancements for Solid-State Drives,第8页以及此处:Windows 7 Disk Defragmenter User Interface Overview):{{3 }}

来自MSDN博客的引用:

  

磁盘碎片整理程序查看直接查询设备的结果   通过ATA IDENTIFY DEVICE命令。碎片整理问题   IOCTL_ATA_PASS_THROUGH请求并检查IDENTIFY_DEVICE_DATA   结构体。如果NomimalMediaRotationRate设置为1,则此磁盘为   被认为是SSD。最新的SSD将响应命令   设置字217(用于报告名义媒体)   转速为1)。 217这个词是在2007年引入的   ATA8-ACS规范。

答案 1 :(得分:3)

这将为您提供Win10上的结果

ManagementScope scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM MSFT_PhysicalDisk");
string type = "";
scope.Connect();
searcher.Scope = scope;

foreach (ManagementObject queryObj in searcher.Get())
{       
    switch (Convert.ToInt16(queryObj["MediaType"]))
    {
        case 1:
            type = "Unspecified";
            break;

        case 3:
            type = "HDD";
            break;

        case 4:
            type = "SSD";
            break;

        case 5:
            type = "SCM";
            break;

        default:
            type = "Unspecified";
            break;
    }
}
searcher.Dispose();

P.s。字符串类型是最后一个驱动器,请更改为数组以获取所有驱动器