2

接続されたドライブが、SATA、IDE、eSATA、または Firewire を介して USB 接続されているかどうかを確認したいと思います。WMI を使わずに見つける方法はありますか? このコードを使用して情報を取得しています。

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

 }

残念ながら、これは USB 経由で接続されたすべての HDD に対して返され、DriveType.FixedUSB スティックのみが になりますDriveType.Removable

私はこのようなものを探していると思います...実際に何を探しているのかわかりません。残念ながらGetVolumeInformationInterfaceType

    [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

デバイス マネージャー API は、各ディスクがどのバスとコントローラーに接続されているかを確実に伝えることができます。しかし、それはあまり p/invoke フレンドリーではありません。コードのこの部分を C++ で記述してから、C++/CLI またはdesigned-for-p/invoke エクスポートを使用して C# に適したインターフェイスを作成することをお勧めします。

このソリューションの核となるのはSetupDiGetDeviceRegistryProperty、 に関連付けられた値を取得するための呼び出しSPDRP_BUSTYPEGUIDです。ただし、適切なハンドルを取得するにHDEVINFOPSP_DEVINFO_DATA、いくつかの作業が必要です。

于 2012-12-20T00:48:06.017 に答える
0

なぜバリエーションがそれほど具体的に必要なのかわかりません。ただし、WMI を使用する必要があります。残念ながら、USB ベースのハード ドライブはリムーバブルですが、フラッシュ メモリではなく実際のディスクを使用します。したがって、DriveInfoそれは修正されたと考える可能性が高くなります。

唯一の代替手段は、System.Managementアセンブリをインポートすることです。

各ドライブのバス情報を取得できます。または、このツールを使用して取得することもできますHID Descriptionsまたは、カスタム ドライバを作成するために通常使用される別のツール。

しかし、これはあなたにとって最高のスイートかもしれません。ドライブが外部と見なされるかどうかを簡単に判断する方法が含まれているためです。 これは明らかに固定/リムーバブルには対応しませんが、デバイスのタイプをターゲットにするのに役立ちます

うまくいけば、それはあなたを助けます。

于 2012-12-20T00:32:52.280 に答える