2

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

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

 }

不幸的是,所有通过 USB 连接的 HDD 都会返回DriveType.Fixed,并且只有 USB 记忆棒才能使用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'");

但我宁愿避免它。

4

2 回答 2

0

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

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

您可以检索每个驱动器的总线信息。或者可能使用这个工具来检索HID Descriptions. 或其他通常用于编写自定义驱动程序的工具。

但这可能是您最好的套房;因为它包括一种简单地确定驱动器是否被视为外部驱动器方法。 这显然不会解决固定/可移动的问题,但有助于定位设备类型

希望对您有所帮助。

于 2012-12-20T00:32:52.280 回答
0

设备管理器 API 肯定能够告诉您每个磁盘连接到哪个总线和控制器。但它对 p/invoke 不是很友好。我建议用 C++ 编写这部分代码,然后使用 C++/CLI 或为 p/invoke 导出而设计的 C# 友好界面。

此解决方案的核心将调用SetupDiGetDeviceRegistryProperty以获取与SPDRP_BUSTYPEGUID. 但是要获得正确的HDEVINFO手柄PSP_DEVINFO_DATA将需要一些工作。

于 2012-12-20T00:48:06.017 回答