Tipp 5.10 - Festplattenplatz

Wie kann ich die Festplattengesamtgröße und den freien Platz ermitteln?

Mit dieser Funktion können Sie die Festplattengesamtgröße und den freien Platz ermitteln. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.

Api-AufrufeVerwendete Win32-Api-Aufrufe und Typen: GetDiskFreeSpaceEx, GetDiskFreeSpace, GetDriveType

Beispiel:

Option Explicit
 
Public Declare Function GetDiskFreeSpaceEx _
    Lib "kernel32" Alias _
    "GetDiskFreeSpaceExA" _
    (ByVal lpDirectoryName As String, _
    lpFreeBytesAvailableToCaller As Any, _
    lpTotalNumberOfBytes As Any, _
    lpTotalNumberOfFreeBytes As Any) As Long
 
Public Declare Function GetDiskFreeSpace _
    Lib "kernel32" Alias _
    "GetDiskFreeSpaceA" _
    (ByVal lpRootPathName As String, _
    lpSectorsPerCluster As Long, _
    lpBytesPerSector As Long, _
    lpNumberOfFreeClusters As Long, _
    lpTotalNumberOfClusters As Long) As Long
 
Public Declare Function GetDriveType _
    Lib "kernel32" Alias _
    "GetDriveTypeA" (ByVal nDrive As String) As Long
 
Public Sub HDSizeInfo(ByRef sVolTotalSpace As String, _
                      ByRef sVolFreeSpace As String, _
                      ByVal sDrive As String)
  '// -----------------------------------------------------
  '// Methode:   | Festplattengesamtgröße und freien Platz
  '//            | ermitteln
  '// -----------------------------------------------------
  '// Parameter: | sVolTotalSpace - Gesamtgröße
  '//            | sVolFreeSpace  - verfügbarer Platz
  '//            | sDrive         - Laufwerk
  '// -----------------------------------------------------
  '// Rückgabe:  | s.o.
  '// -----------------------------------------------------
  '// Autor:     | Stefan Kulpa
  '//            | EDV Innovation & Consulting - Dormagen
  '// -----------------------------------------------------
  '// Beispiel:
  '// -----------------------------------------------------
  '// Dim sVolTotalSpace As String
  '// Dim sVolFreeSpace  As String
  '// HDSizeInfo sVolTotalSpace, sVolFreeSpace, "C:"
  '// Debug.Print "Laufwerk C:" & vbCrLf & vbTab & _
   '//   "Gesamt: " & sVolTotalSpace & vbCrLf & vbTab & _
   '//   "Davon noch frei: " & sVolFreeSpace
  '// -----------------------------------------------------
  Const DRIVE_FIXED = 3
  Dim iDrvType As Integer
 
  If Len(Trim(sDrive)) = 0 Then sDrive = "C"
  sDrive = UCase$(Left$(sDrive, 1)) & ":"
  iDrvType = GetDriveType(sDrive)
  If iDrvType = DRIVE_FIXED Then
    If GetVolSpaceData(sDrive, sVolTotalSpace, _
        sVolFreeSpace) <> 0 Then
      sVolTotalSpace = sVolTotalSpace & " Byte"
      sVolFreeSpace = sVolFreeSpace & " Byte"
    End If
  End If
 
End Sub
 
Private Function GetVolSpaceData( _
                 sDrive As String, _
                 sTotalSpace As String, _
                 sFreeSpace As String) As Long
 
  '// -----------------------------------------------------
  '// Festplattenwerte größer als 2 GB lassen sich nicht
  '// GetDiskFreeSpace ermitteln.
  '// Die Funktion GetDiskFreeSpaceEx() steht u.U. erst ab
  '// Win95b zur Verfügung.
  '// -----------------------------------------------------
  Const csNUMFORMAT       As String = "###,###,###,###,###"
  '// -----------------------------------------------------
  '// Rückgabewerte für GetDiskFreeSpaceEx()
  '// -----------------------------------------------------
  'Überlauf vermeiden!
  Dim lFreeBytesAvailableToCaller     As Currency
  Dim lTotalNumberOfBytes             As Currency
  Dim lTotalNumberOfFreeBytes         As Currency
 
  '// -----------------------------------------------------
  '// Rückgabewerte für GetDiskFreeSpace()
  '// -----------------------------------------------------
  Dim lBytesPerSector                 As Long
  Dim lSectorsPerCluster              As Long
  Dim lNumberOfFreeClusters           As Long
  Dim lTotalNumberOfClusters          As Long
 
  Dim lTotal                          As Long
  Dim lRes                            As Long
 
  On Error Resume Next  '!
  '// -----------------------------------------------------
  '// 1. Versuch: GetDiskFreeSpaceEx() benutzen
  '// -----------------------------------------------------
  lRes = GetDiskFreeSpaceEx(sDrive, _
      lFreeBytesAvailableToCaller, _
      lTotalNumberOfBytes, _
      lTotalNumberOfFreeBytes)
  If lRes <> 0 Then
    sTotalSpace = _
        Format$(lTotalNumberOfBytes * 10000, csNUMFORMAT)
    sFreeSpace = _
        Format$(lTotalNumberOfFreeBytes * 10000, _
        csNUMFORMAT)
  Else
    '// ---------------------------------------------------
    '// 2. Versuch: GetDiskFreeSpace() benutzen
    '// ---------------------------------------------------
    lRes = GetDiskFreeSpace(sDrive, _
        lSectorsPerCluster, _
        lBytesPerSector, _
        lNumberOfFreeClusters, _
        lTotalNumberOfClusters)
    If lRes <> 0 Then
      lTotal = lSectorsPerCluster
      lTotal = lTotal * lBytesPerSector * _
          lTotalNumberOfClusters
      sFreeSpace = _
          Format$(lSectorsPerCluster * _
          lBytesPerSector * _
          lNumberOfFreeClusters, csNUMFORMAT)
      sTotalSpace = _
          Format$(lTotal, csNUMFORMAT)
    End If
  End If
  GetVolSpaceData = lRes
 
End Function