Tipp 0497 Datenträger formatieren
Autor/Einsender:
Datum:
  Detlev Schubert
06.06.2006
Entwicklungsumgebung:   VB 6
Der Windows-Explorer stellt über den Menüpunkt Datei / Formatieren einen Dialog zur Formatierung von Laufwerken zur Verfügung. Dieser Dialog lässt sich auch in eigene Anwendungen einbinden. Der Vorteil ist, wenn beispielsweise Daten auf ein nicht formatiertes Wechselmedium gespeichert werden müssen, kann der Datenträger direkt aus der Anwendung heraus formatiert werden, ohne dass dies von einer andere Anwendung übernommen werden muss.
Dazu verwenden wir die undokumentierte API-Funktion SHFormatDrive, die im 1. Parameter das Handle des aufrufenden Fensters erwartet. Der Parameter Drive erwartet das zu formatierende Laufwerk, wobei das Laufwerk A den Wert 0, B den Wert 1, C den Wert 2 usw. hat. Soll in der Anwendung das Formatieren lediglich für ein Diskettenlaufwerk möglich sein, braucht der Wert für Drive  lediglich fest mit 0 vorgegeben werden.
Mit dem Parameter fmtID kann die Kapazität des zu formatierenden Laufwerks vorgegeben werden. Es ist jedoch sinnvoll mit der Konstanten SHFMT_ID_DEFAULT die für das Laufwerk gültige Standardgröße vorzugeben. Mit dem letzten Parameter Options lässt sich noch festlegen, ob der Datenträger im Schnellverfahren (SHFMT_OPT_QUICK), im normalen Verfahren (SHFMT_OPT_FULL) oder ob noch zusätzlich (nur bei den Betriebssystemen Windows 9x und Me) die Systemdateien auf den Datenträger übertragen werden sollen.
 
Option Explicit

Private Declare Function GetDriveType Lib "kernel32" Alias _
     "GetDriveTypeA" (ByVal nDrive As String) As Long

Private Declare Function SHFormatDrive Lib "shell32" _
     (ByVal hWnd As Long, ByVal Drive As Long, ByVal _
     fmtID As Long, ByVal Options As Long) As Long

Const SHFMT_ID_DEFAULT = &HFFFF&
Const SHFMT_ID_360 = 3
Const SHFMT_ID_720 = 5

Const SHFMT_OPT_QUICK = 0
Const SHFMT_OPT_FULL = 1
Const SHFMT_OPT_SYSONLY = 2

Const DRIVE_CDROM = 5
Const DRIVE_FIXED = 3
Const DRIVE_NO_ROOT_DIR = 1
Const DRIVE_RAMDISK = 6
Const DRIVE_REMOTE = 4
Const DRIVE_REMOVABLE = 2
Const DRIVE_UNKNOWN = 0

Const SHFMT_ERROR = -1
Const SHFMT_CANCEL = -2
Const SHFMT_NOFORMAT = -3
Const SHFMT_NODRIVE = -4

Dim Harddisk As Boolean
Dim DriveType As Long

Private Sub Command1_Click()
  Dim FormatOption As Long
  Dim DriveNumber As Integer

  FormatOption = IIf(Check1.Value = 1, 0, 1)
  DriveNumber = (Asc(UCase(Drive1.Drive)) - 65)

  If Harddisk = True Then
    If MsgBox("Soll das Festplattenlaufwerk wirklich formatiert" _
       & " werden ?", vbYesNo, "Hinweis") = vbNo Then Exit Sub
  End If

  FormatDrive DriveNumber, FormatOption
End Sub

Private Sub Drive1_Change()
  DriveType = GetDriveType(UCase(Drive1.Drive))
  Harddisk = False

  Select Case DriveType
    Case DRIVE_REMOVABLE, DRIVE_FIXED
      Command1.Enabled = True
      If DriveType = DRIVE_FIXED Then Harddisk = True
    Case Else
      Command1.Enabled = False
  End Select
End Sub

Private Sub FormatDrive(DriveNumber As Integer, _
    FormatOption As Long)
  Dim Msg As String
  Dim RetVal As Long

  RetVal = SHFormatDrive(Me.hWnd, DriveNumber, _
    SHFMT_ID_DEFAULT, FormatOption)

  Select Case RetVal
     Case SHFMT_NODRIVE
       Msg = "Laufwerk ist nicht vorhanden!"
     Case SHFMT_NOFORMAT
       Msg = "Laufwerk konnte nicht formatiert werden!"
     Case SHFMT_CANCEL
       Msg = "Formatiervorgang wurde vorzeitig abgebrochen!"
     Case SHFMT_ERROR
       Msg = "Formatiervorgang konnte nicht fehlerfrei beendet"_
           & " werden!"
     Case Else
       Msg = "" 'Funktion wurde erfolgreich ausgeführt
  End Select

  If Msg <> "" Then
     MsgBox Msg, vbCritical + vbOKOnly, "Hinweis"
  End If
End Sub
 
Hinweis
Dieses Beispiel ist für die Betriebssystem Windows 9x und Me ausgelegt. Ab Windows NT 4.0 sind die Werte der Konstanten SHFMT_OPT_QUICK und SHFMT_OPT_FULL vertauscht, dies ist im Downloadbeispiel hinlänglich dokumentiert.

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
VB-Version
VBA 5
VBA 6
VB 4/16
VB 4/32
VB 5
VB 6


Download  (3,2 kB) Downloads bisher: [ 531 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 30. August 2011