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.