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

Kha*_*moz 12 .net c# hardware hard-drive

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

    ManagementClass driveClass = new ManagementClass("Win32_DiskDrive");
    ManagementObjectCollection drives = driveClass.GetInstances(); 
Run Code Online (Sandbox Code Playgroud)

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

我需要直接检查一下吗?

Sim*_*ier 9

WMI无法轻易确定这一点.这里有一个解决方案,它基于Windows 7用于确定磁盘是否为SSD的相同算法(此处的算法更多:固态驱动器的Windows 7增强功能,第8页以及此处:Windows 7磁盘碎片整理程序用户界面概述):在C#中判断SSD是否存在

来自MSDN博客的引用:

磁盘碎片整理程序查看通过ATA IDENTIFY DEVICE命令直接查询设备的结果.碎片整理程序发出IOCTL_ATA_PASS_THROUGH请求并检查IDENTIFY_DEVICE_DATA结构.如果NomimalMediaRotationRate设置为1,则此磁盘被视为SSD.最新的SSD将通过设置字217(用于将标称介质旋转速率报告为1)来响应该命令.217这个词是在2007年的ATA8-ACS规范中引入的.

  • @CodeCaster - 我不同意.它能够测试标称ATA介质旋转速率,应该将其设置为1("非旋转介质").请参阅http://www.t13.org/documents/UploadedDocuments/docs2007/D1699r4a-ATA8-ACS.pdf第139页,尽管某些SSD磁盘/驱动程序实际上无法实现此功能. (2认同)

小智 6

这会给你在 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();
Run Code Online (Sandbox Code Playgroud)

ps字符串类型是最后一个驱动,改成数组获取所有驱动