Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
USB Sticks finden und auflisten, inkl. Friendly Name
Momro123
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

USB Sticks finden und auflisten, inkl. Friendly Name

beantworten | zitieren | melden

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 :-)

[1]: http://stackoverflow.com/questions/3331043/get-list-of-connected-usb-devices
[2]: http://stackoverflow.com/questions/3343310/how-can-i-get-all-usb-drives-plugged-in
[3]: https://social.msdn.microsoft.com/Forums/vstudio/en-US/c3ed85d4-03b1-4d9b-b2b8-e0738d63901e/finding-all-connected-usb-devices-and-their-friendly-names?forum=csharpgeneral
[4]: http://stackoverflow.com/questions/1798152/managementclass-does-not-exist-in-the-namespace-system-management
[5]: http://stackoverflow.com/questions/4314630/managementobject-class-not-showing-up-in-system-management-namespace
[6]: http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

Zitat
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?
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

Zitat von Momro123
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
private Nachricht | Beiträge des Benutzers
Momro123
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Momro123
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

beantworten | zitieren | melden

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 :-D

[1]: https://msdn.microsoft.com/en-us/library/system.io.directory.getlogicaldrives(v=vs.110).aspx
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Momro123 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16148

beantworten | zitieren | melden

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).
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Momro123
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

beantworten | zitieren | melden

Oh, ok, danke für den Hinweis!
private Nachricht | Beiträge des Benutzers
hummigbird1
myCSharp.de - Member

Avatar #avatar-3534.jpg


Dabei seit:
Beiträge: 127

beantworten | zitieren | melden

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)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hummigbird1 am .
private Nachricht | Beiträge des Benutzers
Momro123
myCSharp.de - Member



Dabei seit:
Beiträge: 17

Themenstarter:

beantworten | zitieren | melden

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! :)
private Nachricht | Beiträge des Benutzers