ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 12.09.2000

Diese Seite wurde zuletzt aktualisiert am 12.09.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Plattenplatz - hoch gerechnet

Zurück...


Anzeige

(-hg) mailto:hg_getdiskfreespace@aboutvb.de

Haben Sie sich schon gefragt, wie Sie mit so genannten "Large Integer"-Werten in Visual Basic umgehen sollen? Das sind 64-Bit große Zahlen und sie sind wie folgt definiert:

Type LARGE_INTEGER
  lowpart As Long  ' Niederwertiger 32-bit-Anteil
  highpart As Long ' Höherwertiger 32-bit-Anteil
End Type

Es gibt API-Funktionen, die Wertebereiche bearbeiten, für die die an sich schon recht großen 32-Bit-Werte (in Visual Basic ist das der Datentyp Long) nicht mehr ausreichen. So gibt es etwa die Funktion MSDN Library - API GetDiskFreeSpaceExGetDiskFreeSpaceEx, die mit heute gebräuchlichen Festplattengrößen zurecht kommen muss. Die numerischen Parameter dieser Funktion sind dementsprechend als LARGE_INTEGER deklariert:

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
 Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
 lpFreeBytesAvailableToCaller As LARGE_INTEGER, _
 lpTotalNumberOfBytes As LARGE_INTEGER, _
 lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long

Aus den zurück gegebenen Datentypen eine für Menschen lesbare Zahl zu machen, scheint auf den ersten Blick in mathematische Fummelei auszuarten. Auf den zweiten Blick gibt es eine einfachere Lösung. Sie beruht auf dem alten Trick, benutzerdefinierte Variablen gleicher Byte-Länge einander gleich zu setzen.

Den passenden Datentyp dazu bietet Visual Basic selbst schon an. Zahlen des Datentyps Currency sind nämlich 64-Bit-Zahlen. Sie brauchen also nur eine benutzerdefinierte Variable, die ein einziges Element des Datentyps Currency enthält:

Private Type CurType
  CurVal As Currency
End Type

Und schon geht es fast wie von selbst:

Dim LargeInteger as LARGE_INTEGER
Dim Lesbar As Currency

...
LSet Lesbar = LargeInteger
Debug.Print Lesbar.CurVal

Daran, dass laut Visual Basic-Dokumentation Currency-Werte automatisch 4 Nachkommastellen haben sollen, stört sich unsere gerade gezeigte "Konvertierung" recht wenig: Sie liefert ganzzahlige Werte.

Allerdings geht es noch einen Tick einfacher. Sie können nämlich bereits in der Deklaration der API-Funktion problemlos den vertrackten LARGE_INTEGER-Typ durch den Datentyp Currency ersetzen:

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
 Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, _
 lpFreeBytesAvailableToCaller As Currency, _
 lpTotalNumberOfBytes As Currency, _
 lpTotalNumberOfFreeBytes As Currency) As Long

Allerdings meint Visual Basic hier denn doch seinen Willen, sprich vier Nachkommastellen durchsetzen zu müssen. Das braucht Sie aber nicht weiter zu stören. Multiplizieren Sie die zurückgegebenen Werte einfach jeweils mit 10.000 - und schon haben Sie ohne weitere Verrenkungen den gesuchten Plattenplatz als hübsch ganzzahlige Bytes.

Public Sub GetDiskFreeSpace(Drive As String, _
 BytesAvailable As Currency, _
 TotalBytes As Currency, _
 FreeBytes As Currency)

  GetDiskFreeSpaceEx Drive, BytesAvailable, TotalBytes, FreeBytes
  BytesAvailable = BytesAvailable * 10000
  TotalBytes = TotalBytes * 10000
  FreeBytes = FreeBytes * 10000
End Sub

Einen noch schlichteren Aufruf der Funktion GetDiskFreeSpace gibt es nicht. Mit den zurückgegebenen Currency-Werten können Sie wie gewohnt hantieren - sie können Sie auch durch jede beliebige Format-Schablone pressen:

Private Sub Command1_Click()
  Dim BytesAvailable As Currency
  Dim TotalBytes As Currency
  Dim FreeBytes As Currency
  
  GetDiskFreeSpace "C:\", BytesAvailable, TotalBytes, FreeBytes
  Debug.Print
  Debug.Print "Bytes verfügbar: " & _
   Format$(Format$(BytesAvailable, "#,##0"), "@@@@@@@@@@@@@@@")
  Debug.Print "Bytes insgesamt: " & _
   Format$(Format$(TotalBytes, "#,##0"), "@@@@@@@@@@@@@@@")
  Debug.Print "Bytes frei:      " & _
   Format$(Format$(FreeBytes, "#,##0"), "@@@@@@@@@@@@@@@")
End Sub

Modul modGetDiskFreeSpace (modGetDiskFreeSpace.bas - ca. 0,8 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer