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

Posted

技术标签:

【中文标题】C#中检查硬盘是不是为SSD而不在硬盘上写入任何文件的最简单方法是啥?【英文标题】:What is the easiest way in C# to check if hard disk is SSD without writing any file on hard disk?C#中检查硬盘是否为SSD而不在硬盘上写入任何文件的最简单方法是什么? 【发布时间】:2012-11-23 11:21:10 【问题描述】:

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

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

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

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

【问题讨论】:

您可以维护 SSD 驱动器的硬件标识符列表,并对其进行检查。当然,这是一个不断发展的列表...... +1 被殴打。我可以看到您如何使用它在基于内存或磁盘的方法之间切换。衡量访问时间需要时间。 混合驱动器也是一个失败的原因。在我的新笔记本电脑中安装了一个,C: 驱动器是带有 20 GB SSD 的硬盘。这不是一个需要解决的问题。 @Blam 我不打任何人,我问一个真诚的问题。检测 SSD 没有万无一失的方法,但有一些方法可以测量延迟和吞吐量。如果 OP 想要基于此做出决定(不排除混合驱动器和未来的快速存储设备(USB 3 闪存驱动器算不算?)),则应先回答该问题,然后才能给出有用的答案。 我只需要检查包含当前正在运行的操作系统的系统特定是否在 SSD 硬盘上,而不需要任何管理员权限或写入文件。 【参考方案1】:

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 规范。

【讨论】:

这种方法的问题是它不会检测存储是否是SSD,而只是检查它是否具有低延迟和高吞吐量。因此,我向 OP 提出了问题。 :-) @CodeCaster - 我不同意。它能够测试 SSD 的标称 ATA 介质旋转速率,该速率应设置为 1(“非旋转介质”)。请参阅第 139 页的t13.org/documents/UploadedDocuments/docs2007/…,尽管某些 SSD 磁盘/驱动程序实际上无法实现这一点。 其实很好用,之前也找到过这个解决方案,但是还是写文件,需要权限。 @KhaleelHmoz - 您是否使用“名义媒体轮换率”方法(选择 1)? 哦,这并不是真正创建文件,CreateFile API 用于打开驱动器以便能够在其上使用 API,但是是的,“媒体旋转方法”需要管理权限。您是否尝试过“不寻求惩罚”方法?【参考方案2】:

这会给你在 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();

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

【讨论】:

System.Management.ManagementException: '无效类',我 = 伤心 ;(

以上是关于C#中检查硬盘是不是为SSD而不在硬盘上写入任何文件的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以检测驱动器是不是为 SSD?

SSD硬盘接口速率

SSD固态硬盘的GC与Trim

linux下面怎么看固态硬盘SSD的写入量

固态硬盘,正常吗?

如何通过 PHP 检查服务器硬盘类型