如何获得总硬盘大小使用Win32管理对象,而忽略USB驱动器
本文关键字:对象 驱动器 USB 管理 Win32 硬盘 何获得 | 更新日期: 2023-09-27 18:03:56
背景:我为我们单位的帮助台创建了一个应用程序,为资产数据库获取计算机信息。最近有人做库存说,一个用户有一个USB外置硬盘连接,我的应用程序包括它在总硬盘空间。
我如何获得总硬盘驱动器大小使用Win32管理对象,而忽略外部/USB设备?
我愿意使用其他Win32ManagementObjects
项,如Win32_PhysicalMedia
, Win32_LogicalDisk
或Win32_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
我可以获得固定磁盘的总大小,不包括通过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_REMOVABLE
和DRIVE_FIXED