在C#中最简单的方法来检查硬盘是否为SSD而不在硬盘上写入任何文件?

问题描述 投票:12回答:2

我需要检查C#硬盘是否为SSD(固态驱动器),是否没有罚款?我用过:

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

但是它仅给出属性中包含SSD的字符串,我不能依赖它吗?

我需要直接的方法来检查吗?

c# .net hardware hard-drive
2个回答
9
投票

WMI将无法轻松确定。这里有一个解决方案,该解决方案基于Windows 7用来确定磁盘是否为SSD的相同算法(有关此算法的更多信息,请参见Windows 7 Enhancements for Solid-State Drives,第8页,以及此处:Windows 7 Disk Defragmenter User Interface Overview):Tell whether SSD or not in C#

来自MSDN博客的引用:

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


0
投票

这将为您提供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。字符串类型是最后一个驱动器,请更改为数组以获取所有驱动器的字符串

© www.soinside.com 2019 - 2024. All rights reserved.