Laden...

USB Sticks finden und auflisten, inkl. Friendly Name

Erstellt von Momro123 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.700 Views
M
Momro123 Themenstarter:in
17 Beiträge seit 2015
vor 8 Jahren
USB Sticks finden und auflisten, inkl. Friendly Name

Hallo zusammen,

ich möchte gerne alle angeschlossenen USB-Sticks finden. Dazu habe ich schon einige Threads gelesen, wie man die finden könnte: 1, 2, 3.

Mein Code sieht grade so aus (noch nicht viel passiert):


using System;
using System.Collections.Generic;
using System.Windows.Forms;

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

        private void button1_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog.SelectedPath;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var usbDevices = GetUSBDevices();

            foreach (var usbDevice in usbDevices)
            {
                Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}",
                    usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description);
            }

            Console.Read();
        }

        static List<USBDeviceInfo> GetUSBDevices()
        {
            List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

            ManagementObjectCollection collection;
            using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity"))
                collection = searcher.Get();

            foreach (var device in collection)
            {
                devices.Add(new USBDeviceInfo(
                (string)device.GetPropertyValue("DeviceID"),
                (string)device.GetPropertyValue("PNPDeviceID"),
                (string)device.GetPropertyValue("Description")
                ));
            }

            collection.Dispose();
            return devices;
        }
    }

    class USBDeviceInfo
    {
        public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
        {
            this.DeviceID = deviceID;
            this.PnpDeviceID = pnpDeviceID;
            this.Description = description;
        }
        public string DeviceID { get; private set; }
        public string PnpDeviceID { get; private set; }
        public string Description { get; private set; }
    }
}

Beim Compilieren erhalte ich den Fehler, dass der Typ- oder Namespace "ManagementObjectCollection" nicht gefunden wird. System.Management steht aber bei den uses, und ich habe es auch manuell bei Projektmappe->WindowsFormsApplication->Verweise hinzugefügt. Das wurde von sehr vielen Leuten vorgeschlagen 4, 5. Neustart von MS Visual Studio hat nichts gebracht.

Ich nutze Visual Studio Community 2015 mit .NET 4.6. Zielframework ist wohl 4.5.2. Bei den .NET-Einstellungen hab ich nichts geändert. VS ist gerade erst installiert 😉

Ich werde mal mit einer Library rumprobieren 6, würde mich aber freuen, wenn ich das vermeiden könnte! Also falls ihr einen Tipp habt, freue ich mich sehr darüber 😃

J
251 Beiträge seit 2012
vor 8 Jahren

System.Management steht aber bei den uses

Es könnte sein, dass ich in der relativen frühen Stunde bissel schlecht sehe. Aber in welcher Zeile ist der Verweis auf System.Management?

2.207 Beiträge seit 2011
vor 8 Jahren

Beim Compilieren erhalte ich den Fehler, dass der Typ- oder Namespace "ManagementObjectCollection" nicht gefunden wird.

[FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden

M
Momro123 Themenstarter:in
17 Beiträge seit 2015
vor 8 Jahren

Hm, Mist. Ich hatte vorher mal angeklickt, dass unnötige Referenzen gelöscht werden sollen und es dann nicht wieder eingefügt. Ich muss wohl auch erst was frühstücken 😕

Guten Morgen! 👍

M
Momro123 Themenstarter:in
17 Beiträge seit 2015
vor 8 Jahren

Hm, ok, jetzt bekomme ich aber auch nur sowas raus:

USB-Massenspeichergerät
USB\VID_0BDA&PID_0301\0107000000001545
USB\VID_0BDA&PID_0301\0107000000001545

Eigentlich hätte ich gerne den Drive Letter noch dazu gehabt, und wie das Gerät heißt, z.B. "Kensington Stick", oder "2GB Stick". Habt ihr eine Idee, wie man das machen könnte?

Ich versuche es gerade mit GetDrives() (gefunden bei StackOverflow), aber leider steht da auch nicht der Drive Letter drin 😕

foreach (var drive in System.IO.DriveInfo.GetDrives())
            {
                double freeSpace = drive.TotalFreeSpace;
                double totalSpace = drive.TotalSize;
                double percentFree = (freeSpace / totalSpace) * 100;
                float num = (float)percentFree;

                textBox.AppendText("Device: " + LF);
                textBox.AppendText("Drive: "+ drive.Name.ToString() + "with "+ num.ToString()+" free. ");
                textBox.AppendText("Space Remaining: " + drive.AvailableFreeSpace.ToString() +LF);
                textBox.AppendText("Percent Free Space: " + percentFree.ToString()+LF);
                textBox.AppendText("Space used: " + drive.TotalSize.ToString()+LF);
                textBox.AppendText("Type: " + drive.DriveType.ToString()+LF);
                textBox.AppendText("=== === ==="+LF);
            }

[edit2]Ach, blubb. getLogicalDrives() kriegt das teilweise hin 1. Ich geh jetzt weiter rumprobieren 😄

16.834 Beiträge seit 2008
vor 8 Jahren

Ich weiß von nem Kollegen, dass USB Sticks nen stressiges Thema sein können.
.NET deckt hier auch nicht alle Möglichkeiten ab, weshalb Du für den ein oder anderen Zweck (gerade wenns um IDs, Events und Hersteller geht) auf WMI oder auf die Win32 API zurückgreifen und evtl. mehrere Abfragen und deren Resultate kombinieren musst (was andres macht .NET übrigens auch nicht).

M
Momro123 Themenstarter:in
17 Beiträge seit 2015
vor 8 Jahren

Oh, ok, danke für den Hinweis!

127 Beiträge seit 2015
vor 8 Jahren

Und nicht vergessen ... ein USB Stick kann (in der Theorie) auch mehr als ein logisches Laufwerk beinhalten (Stichwort Partition) (oder auch gar keins, bzw. keine Laufwerksbuchstabenzuordnung)

M
Momro123 Themenstarter:in
17 Beiträge seit 2015
vor 8 Jahren

Ich hab mal gelesen, dass es ziemlich schwierig sei, mehrere Partitionen auf einen USB-Stick zu kriegen. Ansonsten denke ich, dass USB-Sticks in meinem Anwendungsfall immer einen Buchstaben bekommen, aber ich werde es mir auf die ToDo-Liste schreiben, dass ich das auch checken muss. Danke für den Hinweis! 😃