Dateisystem eines Laufwerks ermitteln / auslesen
Veröffentlicht am 09.09.2008 von Sebastian Krogolewski
Folgender Artikel zeigt wie man mit Hilfe der Win API Funktion GetVolumeInformationA bzw. GetVolumeInformationW aus der Kernel32.Dll das Dateisystem eines Lauwerks ermitteln kann.
Konstante MAX_PATH definieren:
1
Public Const MAX_PATH As Long = 260
Einbinden der Win API Funktion GetVolumeInformationA bzw. GetVolumeInformationW als GetVolumeInformationAPI aus der Kernel32.Dll:
1
2
3
4
5Public Declare Function GetVolumeInformationAPI Lib "Kernel32" Alias "GetVolumeInformationA" ( _
ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, _
ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _
lpMaximumComponentLength As Long, lpFileSystemFlags As Long, _
ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As String) As Long
GetVolumeInformationA erwartet 8 Parameter:
lpRootPathName: Zeiger auf eine Zeichenkette welche das Wurzelverzeichnis des zu beschreibenden Laufwerks enthält.
lpVolumeNameBuffer: Zeiger auf reservierten Speicher in welchen die Laufwerksbezeichnung geschrieben wird. Maximale größe ist MAX_PATH + 1.
nVolumeNameSize: Größe des reservierten Speichers für die Laufwerksbezeichnung. Maximal MAX_PATH + 1.
lpVolumeSerialNumber: Zeiger auf eine Variable in der die Seriennummer zurückgeliefert wird. Wenn NULL übergeben wird, wird die Seriennummer nicht ermittelt.
lpMaximumComponentLength: Zeiger auf eine Variable welche die Maximallänge eines Teils einer Pfadangabe (zwischen zwei Backslasches) zurückliefert.
lpFileSystemFlags: Zeiger auf eine Variable in der Alle Eigenschaften des verwendeten Dateisystems zurückgeliefert werden.
lpFileSystemNameBuffer: Zeiger auf reservierten Speicher in welchem die Dateisystembezeichnung zurückgeliefert wird. Maximale Länge ist MAX_PATH + 1.
nFileSystemNameSize: Größe des reservierten Speichers für die Dateisystembezeichnung. Maximal MAX_PATH + 1.
Rückgabewert:
Bei Erfolg: Wenn die Funktion erfolgreich ausgeführt wurde liefert die Funktion ein Wert <> 0 zurück.
Bei Fehlschlag: Wenn die Funktion fehlschlägt liefert die Funktion den Wert 0 zurück. Mit GetLastError können weiter Informationen zum Fehler ermittelt werden.
1 2 3 4 56 7 8 9 1011 12 13 14 1516 | Public Function getFilesystem(ByVal DriveLetter As String) As String Dim strVolumeLabel As String Dim strFilesystem As String Dim lenFilesystem As Long Dim RetVal As Long strVolumeLabel = String$(MAX_PATH + 1, 0) strFilesystem = String$(MAX_PATH + 1, 0) RetVal = GetVolumeInformationAPI(Left$(DriveLetter, 1) & ":\", strVolumeLabel, Len(strVolumeLabel), &O0, &O0, &O0, strFilesystem, Len(strFilesystem)) If (RetVal <> 0) Then lenFilesystem = InStr(1, strFilesystem, vbNullChar) - 1 If (lenFilesystem > 0) Then getFilesystem = Left$(strFilesystem, lenFilesystem) End If End IfEnd Function |
Diese Funktion liefert das Dateisystem als String zurück z.B. NTFS oder FAT32. Diese kann jetzt so erweitert werden, dass ein Enum als Rückgabewert zurückliefert wird und alle Fallunterscheidung ohne jegliche Stringvergleiche möglich sind.
Definieren des Enums:
1
2
3
4
56
| Public Enum enFilesystem vbFsUnknown = 0 vbFsNtfs = 1 vbFsFat32 = 2 vbFsFat = 3End Enum |
Nach dem das Enum definiert wurde, wird die Funktion so erweitert das sie diesen als Rückgabetyp verwendet. Mit einem Select Case auf den String der die Dateisystembezeichnung enthält wird jetzt der neue Rückgabewert bestimmt.
1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 3031 32 33 | Public Function getFilesystemEx(ByVal DriveLetter As String) As enFilesystemDim strVolumeLabel As String Dim strFilesystem As String Dim lenFilesystem As Long Dim RetVal As Long strVolumeLabel = String$(MAX_PATH + 1, 0) strFilesystem = String$(MAX_PATH + 1, 0) RetVal = GetVolumeInformationAPI(Left$(DriveLetter, 1) & ":\", strVolumeLabel, Len(strVolumeLabel), &O0, &O0, &O0, strFilesystem, Len(strFilesystem)) If (RetVal <> 0) Then lenFilesystem = InStr(1, strFilesystem, vbNullChar) - 1 If (lenFilesystem > 0) Then 'Dateisystem aus Klartext in enFilesystem umwandeln Select Case UCase(Left$(strFilesystem, lenFilesystem)) Case "NTFS" getFilesystemEx = vbFsNtfs Case "FAT32" getFilesystemEx = vbFsFat32 Case "FAT" getFilesystemEx = vbFsFat Case Else getFilesystemEx = vbFsUnknown End Select Else getFilesystemEx = vbFsUnknown End If Else getFilesystemEx = vbFsUnknown End If End Function |
Hinweis:
Das Enum und die erweiterte Funktion beinhaltet in diesem Beispiel keine vollständige Liste von Dateisystemen welche Windows erkennt.






