如何获得总硬盘大小使用Win32管理对象,而忽略USB驱动器

本文关键字:对象 驱动器 USB 管理 Win32 硬盘 何获得 | 更新日期: 2023-09-27 18:03:56

背景:我为我们单位的帮助台创建了一个应用程序,为资产数据库获取计算机信息。最近有人做库存说,一个用户有一个USB外置硬盘连接,我的应用程序包括它在总硬盘空间。

我如何获得总硬盘驱动器大小使用Win32管理对象,而忽略外部/USB设备?

我愿意使用其他Win32ManagementObjects项,如Win32_PhysicalMedia, Win32_LogicalDiskWin32_DiskPartition,但是:

  • 我只对内部存储总量感兴趣(实际上不关心分区或逻辑驱动器)
  • 我更感兴趣的是找出下面代码中的bug是什么

我有:

long totalSize = 0;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32ManagementObjects.Win32_DiskDrive");
// there may be multiple hard drives, so loop through them all
foreach (ManagementObject mo in searcher.Get())
{
    /*
     * I assume this is where the problem is. I check that the drive type
     * includes "FIXED HARD DISK" (see reference link below)
     */
    mediaType = mo.Properties["MediaType"].Value.ToString().ToUpper();
    if (mediaType.IndexOf("FIXED HARD DISK") >= 0)
    {
        totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString());
    }
}

这个特殊的USB驱动器可能只是向操作系统报告错误信息吗?这可能吗?由于用户的电脑不在现场,我基本上不可能进行调试。

参考:https://msdn.microsoft.com/en-us/library/aa394132 (v = vs.85) . aspx

如何获得总硬盘大小使用Win32管理对象,而忽略USB驱动器

我可以获得固定磁盘的总大小,不包括通过USB连接的磁盘

long totalSize = 0;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
// there may be multiple hard drives, so loop through them all
foreach (ManagementObject mo in searcher.Get())
{
    if (mo.Properties["InterfaceType"].Value.ToString() != "USB")
    {
        totalSize += Convert.ToInt64(mo.Properties["Size"].Value.ToString());
    }
}

尝试你的代码,我收到一个NullReferenceException时读取属性meditype . tostring()的值,所以,我认为这个属性并不总是设置。也许你可以尝试在检查"固定硬盘"之前绕过添加string.IsNullOrEmpty的NullReference,但我不确定这个属性在固定磁盘上永远不会为空。

顺便说一下,使用Win32ManagementObjects.Win32_DiskDrive给我一个ManagementException InvalidQuery,我必须删除Win32ManagementObjects字符串,只留下Win32_DiskDrive

您可以使用经典的Win32函数GetDriveType(),并检查DRIVE_REMOVABLEDRIVE_FIXED