17

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

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

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

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

4

2 回答 2

11

WMI 将无法轻松确定这一点。这里有一个解决方案,它基于 Windows 7 用来确定磁盘是否为 SSD 的相同算法(更多关于算法的信息:Windows 7 Enhancements for Solid-State Drives,第 8 页和此处:Windows 7 磁盘碎片整理程序用户界面概述):在 C# 中判断是否为 SSD

引用 MSDN 博客的一段话:

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

于 2012-12-05T16:21:42.137 回答
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();

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

于 2020-03-20T08:07:57.370 回答