Как отличить USB-накопители от дискет?

Я пытаюсь распознать типы дисководов путем обхода DriveInfo.GetDrives() результата.
Но и для USB, и для гибких дисков я получаю одинаковое значение DriveType.Removable.

Как я могу их различить?


person Break Point    schedule 17.06.2010    source источник
comment
зачем вам это? Наивная попытка могла проверить размер диска.   -  person Henrik Gering    schedule 17.06.2010
comment
Мне это нужно, потому что моя программа ожидает USB-накопитель, и я хочу проверить ввод пользователя. Проверить размер небезопасно, также могут быть USB-устройства небольшой емкости. Спасибо,   -  person Break Point    schedule 17.06.2010
comment
Дубликат? stackoverflow.com/questions/1797128/   -  person Goibniu    schedule 17.06.2010
comment
Спасибо, похоже, верное решение. Можно ли получить MediaType без WMI?   -  person Break Point    schedule 17.06.2010
comment
Народ еще пользуется дискетами? о_О   -  person    schedule 23.12.2010
comment
Я не знал, что вы даже можете КУПИТЬ дискету.   -  person NotMe    schedule 23.12.2010


Ответы (2)


Вы можете использовать WMI (инструментарий управления Windows), чтобы получить больше, чем просто то, что содержится в классе DriveInfo. В этом случае вы можете получить тип интерфейса, который будет «USB» для USB-накопителей.

Пример кода ниже. Вам нужно добавить ссылку на System.Management.

using System.Management;

try
{
    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
        "SELECT * FROM Win32_DiskDrive");

    foreach(ManagementObject queryObj in searcher.Get())
    {
        foreach(ManagementObject o in queryObj.GetRelated("Win32_DiskPartition"))
        {
            foreach(ManagementBaseObject b in o.GetRelated("Win32_LogicalDisk"))
            {
                Debug.WriteLine("    #Name: {0}", b["Name"]);
            }
        }
        // One of: USB, IDE
        Debug.WriteLine("Interface: {0}", queryObj["InterfaceType"]);
        Debug.WriteLine("--------------------------------------------");
    }
}
catch (ManagementException f)
{
    Debug.WriteLine(f.StackTrace);
}

Для справки: эта страница MSDN документирует полный список доступных свойств (поскольку у вас нет автозаполнения для этого).

person ashes999    schedule 23.12.2010
comment
Я не вижу причин извиняться за поздний ответ. Это не форум, и если я не ошибаюсь, некромантия без ответа приветствуется. - person Greg Buehler; 23.12.2010
comment
Я пытаюсь использовать это, но меня немного смущает то, что ManagementObjectSearcher возвращает только фиксированные диски, хотя DriveInfo.GetDrives обнаруживает другие. Можете ли вы предложить хороший ресурс для понимания того, как построить запрос для обнаружения остальных из них? - person Sean Duggan; 12.05.2014
comment
@SeanDuggan Я предлагаю вам создать новый вопрос, чтобы решить эту проблему. Что конкретно вы имеете в виду под «обнаружением других» - какой нефиксированный диск вы ожидаете увидеть, но не видите? - person ashes999; 12.05.2014
comment
У меня есть USB-накопитель и SD-карта, а также фиксированный диск и сетевой диск. DriveInfo.GetDrives находит все четыре диска. Код, который вы цитируете выше, получает только фиксированный диск и сетевой диск. - person Sean Duggan; 12.05.2014
comment
Да, определенно новый вопрос - он даст вам лучшие ответы, поскольку я не совсем профессионал WMI. Вы можете попробовать заменить Win32_DiskDrive на Win32_LogicalDisk или Win32_MappedLogicalDisk и посмотреть, пригодятся ли вам эти данные; см. эту ссылку. - person ashes999; 12.05.2014

Привод компакт-дисков и дисковод для гибких дисков не готовы, поэтому вы можете попробовать следующее:

foreach (var dr in DriveInfo.GetDrives())
{
    if (dr.IsReady == true)
    {
        Console.WriteLine(string.Format("name : {0}   type : {1}", dr, dr.DriveType));
    }
}

Это простой способ отличить USB-устройства от гибких дисков.

person Ali Besharati    schedule 03.04.2016