如何在忽略USB驱动器的同时使用Win32 ManagementObjects获取总硬盘大小?

时间:2016-08-25 17:55:35

标签: c# winapi

后台:我为我们单位的帮助台创建了一个应用程序,用于抓取资产数据库的计算机信息。最近有人做库存说用户连接了USB外置硬盘,我的应用程序将其包含在整个硬盘空间中。

如何在忽略外部/ USB设备的情况下使用Win32 ManagementObjects获取总硬盘大小?

我愿意使用其他Win32ManagementObjects项,例如Win32_PhysicalMediaWin32_LogicalDiskWin32_DiskPartition,但是:

  • 我只对整个内部存储感兴趣(实际上并不关心分区或逻辑驱动器)
  • 我更感兴趣的是找出下面代码中的错误

这就是我所拥有的:

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

2 个答案:

答案 0 :(得分:2)

我可以获得固定磁盘的总数,不包括使用此代码通过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());
    }
}

尝试代码我在读取属性MediaType.ToString()的值时收到了NullReferenceException,因此,我认为并不总是设置此属性。在检查“FIXED HARD DISK”之前,您可能会尝试在NullReference中添加string.IsNullOrEmpty,但我不确定此属性在固定磁盘上永远不会为空。

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

答案 1 :(得分:-2)

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