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

时间:2018-04-05 14:10:40

标签: c# windows

我花了很多时间在这上面,虽然我接近答案,但它仍然暗示我,所以我会问那些比我更聪明的人帮忙。

我在读卡器中有一张SD卡需要识别。我可以记忆,但我不能说它是SD卡还是Compact Flash还是USB存储器。我搜索并发现了许多有趣的文章,但没有明确的答案。我试着看GUIDS,但这导致死胡同,因为它们是设备独有的,但对于所有SD卡都不一样。

接下来我发现了一篇文章说找了PDCAP_D2_SUPPORTED唉我在那里画了一个空白,因为我无法在c#中工作。

接下来我在MSDN中发现在“Win32_PhysicalMedia类”中有一个名为“uint16 MediaType”的成员,如果我从中得到30,那么我就有了一张“存储卡”。当我尝试进行此工作时,它返回NULL。经过几个小时疯狂打字尝试各种各样的事情后,我已经撞墙了。要运行下面的代码,请使用button = btn_get_info和richtextbox = rchtxtbx_output创建一个C#表单。您将看到我可以从“Win32_DiskDrive”以及“DriveInfo.GetDrives()”获取数据,但很少从“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");
        }
    }
    }
}

似乎逻辑磁盘和物理磁盘之间存在差异。不确定这个发现是否对我有帮助。但是我在Windows中发现了一个名为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:

我希望找到媒体类型并使用它,但是再次在操作系统上面的代码中没有给我MediaType。

仍然无法确定如何判断它是SDHC卡还是USB读卡器上的驱动器,但搜索仍在继续。

0 个答案:

没有答案