DevTrain Startseite Advanced Developers Conference vom 14.-15. Februar 2011  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Hannes Preishuber Artikel Drucken
        
Ist Diskette im Laufwerk?

Banale aber wichtige Frage, wenn man Dateien auf Diskette schreiben möchte! Ein Try Catch in .NET schlägt fehl, da keine Exception gefeuert wird. Einzig ein Dialog poppt hoch, der zum Einlegen der Diskette auffordert.

Betrachten wir das Problem im Detail. Zunächst ist es wichtig zu wissen, welche Laufwerke mein PC (Server) besitzt. Das funktioniert indem aus dem Namespace System.IO GetLocicalDrives verwendet wird.
Dazu muss ein Directory Object instanziert werden aus dem die Funktion aufgerufen wird. Dabei erhält man die Laufwerksbuchstaben. Folgender Code wurde mit einer Windows Form VB.NET Anwendung geschrieben.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dirInfo As Directory
        Dim disk As String
        Me.ListBox1.Items.Clear()
        Dim disks() As String = dirInfo.GetLogicalDrives()
        For Each disk In disks
            Me.ListBox1.Items.Add(disk & GetDriveTyp(disk))
        Next
 End Sub

Das Ergebnis könnte so aussehen
A:\
C:\
E:\
G:\

Leider haben wir jetzt nur erfahren, das ein Diskettenlaufwerk vorhanden ist. Dabei wollen wir doch wissen, ob eine Diskette drinnen steckt. Dies fehlt so in den Basis Klassen. Möglicherweise sind Sicherheitsrichtlinien dafür ausschlaggebend.

Über die WMI (Windows Management Instrumentation) lässt sich ein komplette Windows System fernbedienen. (Soweit es die Rechte zulassen)
Damit lassen sich Hardware & Software Informationen auslesen und auch setzen. Erst ab Windows 2000 ist die volle Funtkionalität enthalten.

Wir verwenden die WIN32 Logical Drives um Details über das Diskettenlaufwerk zu erhalten. Die Doku dazu findet sich im Web oder im SDK.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_logicaldisk.asp

Über die Hilfsfunktion GetDriveType wird eine Statusinformation über das Laufwerk zurückgegeben. Dazu wird zuerst ein Management Object instanziert. Das erfordert das einbinden des Namespaces System.Management.
Dazu wird ein Kommando in der Form win32_logicaldisk.deviceid=A: übergeben. Eine genauere Beschreibung dazu entnehmen Sie der Doku.
Auf diesem Objekt kann dann z.b. über DriveType der Typ des Laufwerks gelesen werden. Schliesslich muss das Diskettenlaufwerk nicht zwingend den Buchstaben A haben.

Ein weiteres Problem ergibt sich aus der Logik. Selbst wenn die Diskette eingelegt ist, ist nicht sicher, das wir auch darauf schreiben können. Es könnte ein Schreibschutz bestehen oder schlicht zu wenig Platz sein.
Mit disk("FileSystem") lässt sich feststellen, ob das Diskettenlaufwerk ein Filesystem aufweist. Wenn hier nothing zurückgegeben wird, ist entweder keine Diskette im LAufwerk oder diese icht formatiert.
Am sinnigsten erscheint den freien Platz zu prüfen. Damit liegt eine formatierte Diskette mit ausreichend Speicher im Laufwerk.

Function GetDriveTyp(ByVal DriveLetter As String) As String
        Dim sDriveType As String
        Dim sDriveDescription As String
        On Error Resume Next
        Dim disk As New ManagementObject("win32_logicaldisk.deviceid=""" & _
           Replace(DriveLetter, "\", "") & """")
        disk.Get()
        sDriveType = disk("DriveType").ToString()
        Select Case sDriveType
            Case "0"
                sDriveDescription = "Unknown"
            Case "1"
                sDriveDescription = "No Root Directory"
            Case "2"
                sDriveDescription = "Removable Disk"
            Case "3"
                sDriveDescription = "Local Disk"
            Case "4"
                sDriveDescription = "Network Drive"
            Case "5"
                sDriveDescription = "Compact Disc"
            Case "6"
                sDriveDescription = "RAM Disk"
            Case Else
                sDriveDescription = "Unknown"
        End Select
        Dim status As String
        status = disk("FreeSpace").ToString()
        GetDriveTyp = sDriveDescription + " " + status
        disk = Nothing
End Function


Über WMI gibt es umfangreiche Bücher. Es hat direkt nichts mit .NET programmierung zu tun. Für systemnahe Dinge ist WMI aber oft die Alternative zu Win 32 API Calls.

 


DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine verknüpften Dokumente
    Keine Links vorhanden

  Erfasst am: 07.04.2003
  Gültig bis: 06.07.2003
4 Ratings
Bewertung: 75,0%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG