Moin moin
Ich habe mir hier eine WMI Abfrage gemacht, um verschiedene Laufwerke zu ermitteln. Erstmal alles auf dem Form, später will ich das in eine Class setzen.
Nun zu meinem Problem.
Wenn ich das Prog. starte, dauert es viel länger die LW mit
1.) Warum ist das so?
2.) Kann ich die Abfrage kürzen? Weniger For/Each Schleifen?
Das habe ich schon versucht, klappte aber nicht.
Spoiler anzeigen
Versuch zu Punkt 2.
3.) Kann ich diese Abfragen bzgl. der "internen" und "externen" Laufwerke evtl noch anders gestallten? Die "DriveInfo" aus dem .Net filtert leider die USB-Festplatten zu "internen Festplatten"
Spoiler anzeigen
Verschoben. ~Thunderbolt
Ich habe mir hier eine WMI Abfrage gemacht, um verschiedene Laufwerke zu ermitteln. Erstmal alles auf dem Form, später will ich das in eine Class setzen.
Nun zu meinem Problem.
Wenn ich das Prog. starte, dauert es viel länger die LW mit
ListUSBDrive
als mit ListDrive
zu ermitteln.1.) Warum ist das so?
2.) Kann ich die Abfrage kürzen? Weniger For/Each Schleifen?
Das habe ich schon versucht, klappte aber nicht.
Versuch zu Punkt 2.
Ein Ausnahmefehler des Typs "System.Management.ManagementException" ist in System.Management.dll aufgetreten. Zusätzliche Informationen: Die Anfrage ist ungültig.
VB.NET-Quellcode
- Private Sub ListUSBDrives()
- cmbDrives.Items.Clear()
- Dim query As String = "SELECT LD.DeviceID FROM Win32_DiskDrive DD " &
- "JOIN Win32_DiskDriveToDiskPartition DP ON DD.DeviceID=DP.Antecedent " &
- "JOIN Win32_LogicalDiskToPartition LP ON DP.Dependent=LP.Dependent " &
- "JOIN Win32_LogicalDisk LD ON LP.Dependent=LD.DeviceID " &
- "WHERE (DD.MediaType='External hard disk media' OR DD.MediaType='Removable media')"
- Dim searcher As New ManagementObjectSearcher(query)
- For Each logicalDisk As ManagementObject In searcher.Get()
- cmbDrives.Items.Add(logicalDisk("DeviceID").ToString())
- Next
- End Sub
3.) Kann ich diese Abfragen bzgl. der "internen" und "externen" Laufwerke evtl noch anders gestallten? Die "DriveInfo" aus dem .Net filtert leider die USB-Festplatten zu "internen Festplatten"
VB.NET-Quellcode
- Private Sub ListDrives()
- If Not isCleaning Then
- cmbDrives.Items.Clear()
- For Each drive As DriveInfo In allDrives
- If drive.IsReady Then
- Dim label As String = drive.VolumeLabel
- If Not String.IsNullOrEmpty(label) AndAlso label.All(Function(c) Char.IsLetterOrDigit(c) OrElse Char.IsWhiteSpace(c)) Then
- cmbDrives.Items.Add(drive.Name) ' & " (" & label & ")")
- Else
- cmbDrives.Items.Add(drive.Name)
- End If
- End If
- Next
- If cmbDrives.Items.Count > 0 Then
- cmbDrives.SelectedIndex = 0
- End If
- End If
- End Sub
- Private Sub ListUSBDrives()
- If Not isCleaning Then
- cmbDrives.Items.Clear()
- ' Suchabfrage nur für USB- und Wechselmedienlaufwerke
- Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE (MediaType='External hard disk media' OR MediaType='Removable media')")
- For Each drive As ManagementObject In searcher.Get()
- Dim partitionsQuery As String = $"ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{drive("DeviceID")}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
- Dim partitionSearcher As New ManagementObjectSearcher(partitionsQuery)
- For Each partition As ManagementObject In partitionSearcher.Get()
- Dim logicalDisksQuery As String = $"ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{partition("DeviceID")}'}} WHERE AssocClass = Win32_LogicalDiskToPartition"
- Dim logicalDisksSearcher As New ManagementObjectSearcher(logicalDisksQuery)
- For Each logicalDisk As ManagementObject In logicalDisksSearcher.Get()
- cmbDrives.Items.Add(logicalDisk("DeviceID").ToString())
- Next
- Next
- Next
- If cmbDrives.Items.Count > 0 Then
- cmbDrives.SelectedIndex = 0
- End If
- End If
- End Sub
- Private Sub chkOnlyUSB_CheckedChanged(sender As Object, e As EventArgs) Handles chkOnlyUSB.CheckedChanged
- If Not chkOnlyUSB.Checked Then
- ListDrives()
- Else
- ListUSBDrives()
- End If
- End Sub
Verschoben. ~Thunderbolt
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()