我需要跟踪 C# 应用程序中的 USB 插入和移除事件,因此我根据 SO 上的其他问题提出了以下想法。
我无法使用这个方法
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable).ToList();
因为当您需要区分已连接和已断开连接的设备时(新设备可以与之前缓存的设备具有相同的驱动器号和名称),这可能会导致很多麻烦。
所以我决定使用WMI来解决这个问题,但我发现无法通过以下方式获取指定USB设备的盘符Win32_USBHub
班级。然后我想我可以像这样执行另一个查询
foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_USBHub").Get())
{
string deviceID = (string)device.GetPropertyValue("DeviceID");
Console.WriteLine("{0}", deviceID);
string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID);
foreach (ManagementObject o in new ManagementObjectSearcher(query).Get())
{
string name = (string)o.GetPropertyValue("Name");
Console.WriteLine("{0}", name);
}
Console.WriteLine("==================================");
}
但它根本不起作用——每次当我尝试执行适用于Win32_LogicalDisk
table.
为什么?我究竟做错了什么?我该如何修复它?也许有更好的方法来解决这个问题?
提前致谢。
你会得到一个例外,因为你的deviceID
包含需要转义的字符(反斜杠)。通过简单的替换,您不应该遇到异常。
string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID.Replace(@"\", @"\\"));
然而,从 WMI 获取 USB 驱动器号有点复杂。您需要学习一些课程,如 @MSalters 在他的评论中发布的链接中所述:
Win32_DiskDrive-> Win32_DiskDriveToDiskPartition -> Win32_DiskPartition -> Win32_LogicalDiskToPartition -> Win32_LogicalDisk.
找到了代码的一点修改版本here为我工作:
foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_DiskDrive WHERE InterfaceType LIKE 'USB%'").Get())
{
Console.WriteLine((string)device.GetPropertyValue("DeviceID"));
Console.WriteLine((string)device.GetPropertyValue("PNPDeviceID"));
foreach (ManagementObject partition in new ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + device.Properties["DeviceID"].Value
+ "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
{
foreach (ManagementObject disk in new ManagementObjectSearcher(
"ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
+ partition["DeviceID"]
+ "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
{
Console.WriteLine("Drive letter " + disk["Name"]);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)