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 😃
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?
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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! 👍
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 😄
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 - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)
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! 😃