c# - 在没有 WMI 的情况下检测 HDD 是否通过 USB 或其他方式连接

标签 c# .net pinvoke

我想知道连接的驱动器是否是通过 SATA、IDE、eSATA 或 Firewire 连接的 USB。有没有办法不用 WMI 就能找到它?我正在使用此代码来获取一些信息。

 DriveInfo[] drives = DriveInfo.GetDrives();
 foreach (DriveInfo drive in drives) {
    // DriveType.Fixed && DriveType.Removable

 }

不幸的是,所有通过 USB DriveType.Fixed 连接的 HDD 都会返回,并且只有 USB Sticks 变为 DriveType.Removable

我想我正在寻找这样的东西...只是我不知道我到底在寻找什么。不幸的是 GetVolumeInformation 没有提供了解 InterfaceType

的方法
    [DllImport("kernel32.dll")]
    private static extern long GetVolumeInformation(
        string PathName, 
        StringBuilder VolumeNameBuffer, 
        UInt32 VolumeNameSize, 
        ref UInt32 VolumeSerialNumber, 
        ref UInt32 MaximumComponentLength, 
        ref UInt32 FileSystemFlags, 
        StringBuilder FileSystemNameBuffer, 
        UInt32 FileSystemNameSize);

我想跳过 WMI。我知道我可以通过或多或少的代码找到它:

  ManagementObjectSearch theSearcher = new ManagementObjectSearcher(
  "SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'");

但我宁愿避免它。

最佳答案

我不确定您为什么需要如此特别的变体;但你必须使用 WMI。不幸的是,虽然基于 USB 的硬盘驱动器是可移动的,但它仍然使用实际的磁盘而不是闪存。因此 DriveInfo 将更有可能认为它已修复。

唯一的选择是导入 System.Management 程序集。

您可以检索每个驱动器的总线信息。或者可能使用此工具检索 HID Descriptions .或通常用于编写 custom drivers 的其他工具.

但这可能是您最好的套件;因为它包括一种简单地确定驱动器是外部还是不是的方法。 Which obviously won't address the fixed / removable but will assist in targeting the type of device .

希望对您有所帮助。

关于c# - 在没有 WMI 的情况下检测 HDD 是否通过 USB 或其他方式连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421720/

相关文章:

c# - 调用Delphi dll函数时PInvokeStackImbalance

c# - 我应该为 hh :mm tt in SQL Server 保存什么数据类型

c# - CLR如何定位pdb符号文件

.net - 从 .net 2.0 升级到 4.0 会提高性能吗?

c# - 在方法开始时使用Volatile.Write的原因

c# - 从 c# LPCTSTR 编码不再工作

c# - 在 C# 和非托管 C++ 之间传递自定义对象

c# - 剧作家 "Element is not attached to the DOM"

c# - 如何将原始电子邮件字符串解析为 System.Net.Mail.MailMessage 对象?

c# - 如何将复杂的 linq 映射到对象