|
Ein Schreibversuch auf einem schreibgeschützten Datenträger kann natürlich nicht erfolgreich sein. Die Frage ist nur, wie Sie feststellen können, ob ein Datenträger schreibgeschützt ist. Im Prinzip bieten sich dazu mehrere Möglichkeiten an.
So könnten Sie versuchen, eine temporäre Datei auf dem Datenträger anzulegen (und diese selbstverständlich anschließend gleich wieder zu löschen!). Schlägt der Versuch fehl, ist der Datenträger wohl schreibgeschützt. Allerdings setzt dies zumindest voraus, dass Sie zuvor geprüft haben, ob der Datenträger überhaupt verfügbar ist (Diskette eingelegt...). Doch auch dann kann die Ursache für das Fehlschlagen des Schreibversuchs darin liegen, dass der Datenträger (etwa eine Diskette) schlicht voll ist. Bei einer CD-ROM hingegen wird der Schreibversuch wegen der tatsächlichen physischen Unbeschreibbarkeit einer CD-ROM fehlschlagen (zumindest bei Schreibversuchen auf Dateisystembasis, so lange kein transparent arbeitender Treiber für wiederbeschreibbare CD-ROMs vorhanden ist). Bei Netzwerklaufwerken kann ein Fehlschlagen vielerlei Ursachen haben - angefangen von einer Trennung vom Netzwerk bis hin zu fehlenden Rechten. Der Fehlversuch lässt sich also nicht eindeutig auf einen Schreibschutz zurückführen.
Der CD-ROM-Aspekt lässt sich umgehen, indem Sie zunächst den Laufwerkstyp prüfen (siehe: "Der Typ ist gefragt"). CD-ROM-Laufwerke melden sich mit einer eigenen Kennung und lassen sich so schon vorab eindeutig aussortieren. Ebenso können Sie so auch Netzwerklaufwerke aussortieren. Gewöhnliche Festplattenlaufwerke oder Ramdisks sind im Normalfall nicht schreibgeschützt - Ausnahmen hiervon müssten Sie wohl sowieso auf andere Weise entsprechend der Schutztechnik prüfen. Bei einer Diskette hingegen sind immerhin noch alle Fehler-Möglichkeiten gegeben - auch einschließlich fehlender Rechte.
Unabhängig vom Schreiben einer Datei und damit beispielsweise unabhängig vom Füllgrad einer Diskette können Sie jedoch versuchen, den Datenträgernamen (Volumelabel) auszulesen und wieder unverändert zurückzuschreiben. Dies schlägt bei schreibgeschützten Disketten tatsächlich fehl, berührt jedoch nicht alle anderen möglichen Ursachen. Das Volumelabel liefert Ihnen die VB-Funktion Dir$() zu einem gegebenen Pfad auf diesem Laufwerk (naheliegenderweise dem Wurzelpfad, etwa "A:\") mit der Konstanten vbVolume. Das versuchsweise Zurückschreiben des Volumelabels erledigt die API-Funktion SetVolumeLabel.
Die folgende Funktion DriveCanWrite sortiert die verschiedenen Möglichkeiten. Sie gibt einen der Werte der Enumeration DriveCanWriteConstants zurück. Nur bei einem Diskettenlaufwerk (bzw. einem vergleichbaren mobilen Datenträgertyp wie ZIP-Laufwerk usw.) erfolgt der Schreibversuch über das Volumelabel. Ein CD-ROM-Laufwerk wird automatisch als nicht beschreibbar gemeldet. Alle anderen Datenträger werden als nicht spezifizierbar gemeldet - hier müssen Sie gegebenenfalls andere Prüfungen nachordnen. Ist der Datenträger gar nicht verfügbar, wird auch dies angezeigt. Als Parameter können Sie der Funktion einen beliebigen Pfad auf dem zu prüfenden Datenträger angeben (allerdings keine UNC-Namen), oder einfach nur den Laufwerksbuchstaben selbst.
Private Declare Function GetDriveType Lib "kernel32" _
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Private Declare Function SetVolumeLabel Lib "kernel32" _
Alias "SetVolumeLabelA" (ByVal lpRootPathName As String, _
ByVal lpVolumeName As String) As Long
Public Enum DriveCanWriteConstants
dcwNo
dcwYes
dcwUnspecified
dcwNotAvailable
dcwInvalidPath
End Enum
Public Function DriveCanWrite(ByVal RootPath As String) _
As DriveCanWriteConstants
Dim nPath As String
Dim nDriveType As Long
Const DRIVE_NOTAVAILABLE = 1
Const DRIVE_CDROM = 5
Const DRIVE_REMOVABLE = 2
nPath = UCase$(Left$(RootPath, 1)) & ":\"
If nPath Like "[A-Z]:\" Then
nDriveType = GetDriveType(nPath)
Select Case nDriveType
Case DRIVE_NOTAVAILABLE
DriveCanWrite = dcwNotAvailable
Case DRIVE_REMOVABLE
DriveCanWrite = Abs(CInt(CBool(SetVolumeLabel(nPath, _
Dir$(nPath, vbVolume)) <> 0&)))
Case DRIVE_CDROM
DriveCanWrite = dcwNo
Case Else
DriveCanWrite = dcwUnspecified
End Select
Else
DriveCanWrite = dcwInvalidPath
End If
End Function
|