VB-Homepage Tipp 415

Speicherermittlung bei Festplatten > 2GB

Es ist ja nicht das erste mal, daß die Entwicklung der Hardware eine Modifizierung der Software verlangt und so sind Sie vielleicht auch schon auf ein Problem gestoßen, daß Festplatten mit einer Kapazität von über 2GB mit der bekannten, und in der Tipp DB auch schon beschriebenen API Funktion "GetDiskFreeSpace" nicht korrekt erkannt werden.
Aber es gibt auch da Abhilfe, allerdings nur für Windows95B/98 und WinNT4, und zwar in Form einer "neuen" API Funktion "GetDiskFreeSpaceEx".

Für ein Demoprojekt benötigen wir also erstemal die API Funktion und eine Typdefinition.

Allgemein/Deklarationen

Private Declare Function GetDiskFreeSpaceEx Lib "Kernel32" Alias "GetDiskFreeSpaceExA" ( _
ByVal lpRootPathName As String, _
lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _
lpTotalNumberOfBytes As ULARGE_INTEGER, _
lpTotalNumberOfFreeBytes As ULARGE_INTEGER) _
As Long

Private Type ULARGE_INTEGER
Integer_64Bit(0 To 7) As Byte
End Type

Außerdem eine Aktion die das Ermitteln des freien und belegten Speicherplatzes auf einem ausgewähltem Datenträger ermitteln. Wir wollen in unserem Beispiel, die Auswahl über eine Combobox festlegen und die Aktion über einen Commandbutton auslösen, sowie das Ergebnis in eine Listbox eintragen.
Also benötigen Sie Command1, List1 und Combo1 für unseren Test.

Form/Load
Combo1.AddItem "C:"
Combo1.AddItem "D:"
Combo1.AddItem "E:"
Combo1.AddItem "F:"
Combo1.AddItem "G:"
Combo1.AddItem "H:"
Combo1.Text = Combo1.List(0)

Command1/Click
Dim lRet As Long
Dim RootPath As String
Dim lFreeBytes As ULARGE_INTEGER, lTotalBytes As ULARGE_INTEGER, lTotalFreeBytes As ULARGE_INTEGER
Dim buffer As Double, i As Integer

RootPath = Combo1.Text '"\\server\share"
lRet = GetDiskFreeSpaceEx(RootPath, lFreeBytes, lTotalBytes, lTotalFreeBytes)

List1.Clear
List1.AddItem "--- GetFreeDiskSpaceEx:"

buffer = 0

For i = 0 To 7
   ' Berechnung des Speicherplatzes aus den 8 8-Bit-Werten
   buffer = buffer + lTotalBytes.Integer_64Bit(i) * 2 ^ (i * 8)
Next

List1.AddItem Int(buffer / 1000000) & " MB Speicherplatz gesamt [" & MBFormat(buffer) & "]"

buffer = 0

For i = 0 To 7
   buffer = buffer + lTotalFreeBytes.Integer_64Bit(i) * 2 ^ (i * 8)
Next

List1.AddItem Int(buffer / 1000000) & " MB Speicherplatz frei [" & MBFormat(buffer) & "]"

Soweit hätten wir schon alles, vielleicht ist Ihnen aber schon aufgefallen, das hier mit MBFormat eine weitere Funktion aufgerufen wird. Diese dient lediglich zum
Formatieren der ermittelten Werte.

Allgemein/MBFormat
Private Function MBFormat(ByVal NumBytes As Double) As String

Dim buffer As Double
Dim FormatString As String

buffer = NumBytes / 1000

If buffer < 1000 Then
   FormatString = "KiloByte"
Else
   buffer = buffer / 1000
   If buffer < 1000 Then
      FormatString = "MegaByte"
   Else
      buffer = buffer / 1000
      If buffer < 1000 Then
         FormatString = "GigaByte"
      End If
   End If
End If

MBFormat = Format(buffer, "0.000 " & Chr(34) & FormatString & Chr(34))

End Function

Das war es nun, starten Sie Ihr Projekt mit F5 und ermitteln Sie die Speicherwerte eines Datenträgers. Wenn Sie wollen können Sie ja für einen direkten Vergleich die alte Funktion GetFreeDiskSpace in Ihr Projekt mit einbauen.

Tipp-Download

Quelle :

Zurück zur Übersichtsseite