C# 在USB读卡器中如何识别SD卡

C# 在USB读卡器中如何识别SD卡,c#,windows,C#,Windows,我花了很多时间在这个问题上,虽然我已经接近答案,但它仍然暗指我,所以我会向那些比我更聪明的人寻求帮助 我有一个SD卡在读卡器,我需要确定。我可以查看内存,但我不能说它是SD卡、闪存还是USB内存。我搜索了很多有趣的文章,但没有确定的答案。我试着研究guid,但这会导致一个死胡同,因为它们对于设备来说是独一无二的,但对于所有的SD卡来说却不一样 接下来我发现了一篇文章,上面写着“寻找PDCAP”\u D2\u,唉,我在那里画了一个空白,因为我无法在c中使用它 接下来,我在MSDN中发现,在“Win

我花了很多时间在这个问题上,虽然我已经接近答案,但它仍然暗指我,所以我会向那些比我更聪明的人寻求帮助

我有一个SD卡在读卡器,我需要确定。我可以查看内存,但我不能说它是SD卡、闪存还是USB内存。我搜索了很多有趣的文章,但没有确定的答案。我试着研究guid,但这会导致一个死胡同,因为它们对于设备来说是独一无二的,但对于所有的SD卡来说却不一样

接下来我发现了一篇文章,上面写着“寻找PDCAP”\u D2\u,唉,我在那里画了一个空白,因为我无法在c中使用它

接下来,我在MSDN中发现,在“Win32_PhysicalMedia类”中有一个名为“uint16 MediaType”的成员,如果我从中获得30,那么我就有一个“存储卡”。当我尝试使它工作时,它返回NULL。在疯狂地打字数小时,尝试各种各样的东西后,我感到非常震惊。要运行下面的代码,请使用button=btn\u get\u info和richtextbox=rchtxtbx\u输出创建一个C#表单。您将看到,我可以从“Win32_DiskDrive”以及“DriveInfo.getDrive()”获取数据,但从“Win32_PhysicalMedia”获取的数据很少

Windows可以区分USB设备和SD卡,所以我也应该能够区分。非常感谢您的帮助

using System;
using System.IO;
using System.Windows.Forms;
using System.Management;

 namespace diskinfo
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }

    private void btn_get_info_Click(object sender, EventArgs e)
    {

        foreach (DriveInfo di in DriveInfo.GetDrives())
        {
            if (di.IsReady)
            {
                if (di.DriveType == DriveType.Removable)
                {
                    rchtxtbx_output.AppendText("-------------------------------------------------------\r");
                    rchtxtbx_output.AppendText("FreeSpace = " + di.AvailableFreeSpace + "\r");
                    rchtxtbx_output.AppendText("DriveFormat = " + di.DriveFormat + "\r");
                    rchtxtbx_output.AppendText("DriveType = " + di.DriveType + "\r");
                    rchtxtbx_output.AppendText("IsReady = " + di.IsReady + "\r");
                    rchtxtbx_output.AppendText("RootDirectory = " + di.RootDirectory + "\r");
                    rchtxtbx_output.AppendText("Name = " + di.Name + "\r");
                    rchtxtbx_output.AppendText("TotalFreeSpace = " + di.TotalFreeSpace + "\r");
                    rchtxtbx_output.AppendText("TotalSize = " + di.TotalSize + "\r");
                    rchtxtbx_output.AppendText("VolumeLabel = " + di.VolumeLabel + "\r");
                    rchtxtbx_output.AppendText("\r");
                }
            }
        }


        rchtxtbx_output.AppendText("\r\n-------------------------------------------------------\r\n");



        ManagementObjectSearcher searcher1;
        searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

        foreach (ManagementObject queryObj1 in searcher1.Get())
        {
            rchtxtbx_output.AppendText(
                "\r-------------------------Win32_PhysicalMedia------------------------------\r");

            rchtxtbx_output.AppendText("\rCapacity: " + queryObj1["Capacity"]);
            rchtxtbx_output.AppendText("\rCaption: " + queryObj1["Caption"]);
            rchtxtbx_output.AppendText("\rDescription: " + queryObj1["Description"]);
            rchtxtbx_output.AppendText("\rInstallDate: " + queryObj1["InstallDate"]);
            rchtxtbx_output.AppendText("\rName: " + queryObj1["Name"]);
            rchtxtbx_output.AppendText("\rStatus: " + queryObj1["Status"]);
            rchtxtbx_output.AppendText("\rCreationClassName: " + queryObj1["CreationClassName"]);
            rchtxtbx_output.AppendText("\rManufacturer: " + queryObj1["Manufacturer"]);
            rchtxtbx_output.AppendText("\r Model: " + queryObj1["Model"]);
            rchtxtbx_output.AppendText("\rSKU: " + queryObj1["SKU"]);
            rchtxtbx_output.AppendText("\rSerialNumber: " + queryObj1["SerialNumber"]);
            rchtxtbx_output.AppendText("\rTag: " + queryObj1["Tag"]);
            rchtxtbx_output.AppendText("\rVersion: " + queryObj1["Version"]);
            rchtxtbx_output.AppendText("\rPartNumber: " + queryObj1["PartNumber"]);
            rchtxtbx_output.AppendText("\rOtherIdentifyingInfo: " + queryObj1["OtherIdentifyingInfo"]);
            rchtxtbx_output.AppendText("\rPoweredOn: " + queryObj1["PoweredOn"]);
            rchtxtbx_output.AppendText("\rRemovable: " + queryObj1["Removable"]);
            rchtxtbx_output.AppendText("\rReplaceable: " + queryObj1["Replaceable"]);
            rchtxtbx_output.AppendText("\rHotSwappable: " + queryObj1["HotSwappable"]);
            rchtxtbx_output.AppendText("\rCapacity: " + queryObj1["Capacity"]);
            rchtxtbx_output.AppendText("\rMediaType: " + queryObj1["MediaType"]);
            rchtxtbx_output.AppendText("\rMediaDescription: " + queryObj1["MediaDescription"]);
            rchtxtbx_output.AppendText("\rWriteProtectOn: " + queryObj1["WriteProtectOn"]);
            rchtxtbx_output.AppendText("\rCleanerMedia: " + queryObj1["CleanerMedia"]);


        }

        rchtxtbx_output.AppendText("\r\n-------------------------------------------------------\r\n");


        ManagementObjectSearcher searcher;

        searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

        foreach (ManagementObject queryObj in searcher.Get())
        {
            rchtxtbx_output.AppendText("\r-------------------------Win32_DiskDrive------------------------------\r");
            rchtxtbx_output.AppendText("\rSerialNumber: " + queryObj["SerialNumber"]);
            rchtxtbx_output.AppendText("\rSignature: " + queryObj["Signature"]);
            rchtxtbx_output.AppendText("\rModel: " + queryObj["Model"]);
              rchtxtbx_output.AppendText("\r");
        }
    }
    }
}
增加

逻辑磁盘和物理磁盘之间似乎存在差异。还不确定这个发现是否对我有帮助。然而,我在窗口中发现了一块隐藏的宝石,叫做WMIC。我在命令行中尝试了以下方法

wmic:root\cli>diskdrive get DeviceID,Caption,Model,Mediatype
Caption                              DeviceID            MediaType              Model
SDHC Card                            \\.\PHYSICALDRIVE1  Removable Media        SDHC Card
Micron 1100 SCSI Disk Device         \\.\PHYSICALDRIVE0  Fixed hard disk media  Micron 1100 SCSI Disk Device
Generic MassStorageClass USB Device  \\.\PHYSICALDRIVE2  Removable Media        Generic MassStorageClass USB Device
所以这没有帮助,所以我尝试

wmic:root\cli>logicaldisk get MediaType,Name
MediaType  Name
12         C:
           D:
           E:
我希望找到媒体类型并使用它,但正如上面的代码一样,操作系统没有给我媒体类型


仍然找不到如何辨别它是SDHC卡还是USB读卡器上的驱动器,但搜索仍在继续。

请参阅以下网页:但为什么要使用
linq
标签?