Speicherplatz Informationen eines Laufwerks ermitteln
Veröffentlicht am 28.01.2009 von Sebastian Krogolewski
Jeder Datenträger hat nur begrenzten Speicherplatz. Wenn man große Dateien schreibt, kann dieser nun knapp werden. Es kann bereits vor dem eigentlich Schreibvorgang sein, dass zu wenig zur Verfügung steht oder dass er während dessen durch eine andere Anwendungen oder sogar durch den Benutzer selbst verbraucht wurde. In beiden Fällen stürzt die eigene Anwendung unkontrolliert ab.
Durch eine Fehlerbehandlung kann man dies mit VB eigenen Mitteln abfangen und wenigstens diesen unkontrollierten Absturz verhindern, oder aber man nimmt den eleganteren Weg über die Win API Funktion SHGetDiskFreeSpaceA bzw. SHGetDiskFreeSpaceW aus der Shell32.Dll. Diese Win API Funktion erlaubt es uns schon vor dem Begin oder auch während des Schreibvorgangs selbst zu prüfen ob genug Speicherplatz verfügbar ist.
Nehmen wir mal einen Kopiervorgang als Beispiel:
Bevor der Kopiervorgang startet, prüft die Kopierfunktion, ob genug Speicherplatz frei ist.
Bei Erfolg beginnt Sie zu kopieren, bei Misserfolg zeigt Sie dem Benutzer einen Dialog an, in welchem er "wiederholen" oder aber auch "abbrechen" kann.
Der Benutzer hat nun die Möglichkeit, Speicherplatz freizugeben (temporäre Datein löschen oder Anwendungen Deinstallieren usw.) und dann den Vorgang so lange wiederholen bis genug Speicherplatz vorhanden ist oder er abbricht.
Gehen wir mal davon aus, dass der Speicherplatz jetzt ausreicht und der Kopiervorgang startet:
Während des Kopiervorgangs kann der Speicherplatz immer noch durch andere Anwendungen oder den Benutzer selbst belegt werden. Damit die eigene Anwendung dies erfährt, aktualisiert man immer wieder die Speicherplatzinformationen.
Steht genug Speicherplatz zur Verfügung wird weiter kopiert. Steht nicht genug Speicherplatz zur Verfügung, kann die Anwendung nun den vorhin erwähnten Dialog anzeigen und dem Benutzer die Möglichkeit geben Speicherplatz wieder freizugeben oder den Vorgang abzubrechen.
Einbinden der Win API Funktion SHGetDiskFreeSpaceA bzw. SHGetDiskFreeSpaceW als SHGetDiskFreeSpace aus der Shell32.Dll:
1 2 | Private Declare Function SHGetDiskFreeSpace Lib "shell32" Alias "SHGetDiskFreeSpaceA" (ByVal pszVolume As String, _ pqwFreeCaller As Currency, pqwTot As Currency, pqwFree As Currency) As Long |
SHGetDiskFreeSpaceA erwartet 4 Parameter:
pszVolume: Zeiger auf eine Zeichenkette, welche das Wurzelverzeichnis eines Laufwerks, einen UNC Pfad oder ein Verzeichnis angibt. NULL gibt das aktuelle Verzeichnis an, wird aber erst ab der Version 5.0 der Shell32.Dll unterstützt.
pqwFreeCaller: Adresse eines 8 byte großen Speicherbereichs in dem der verfügbare Speicherplatz, der für den aufrufenden Benutzer verfügbar ist, in Bytes zurückgeliefert wird. Funktioniert nur bei Betriebssystemen, welche Benutzerkontigente unterstützten.
pqwTot: Adresse eines 8 byte großen Speicherbereichs, in dem die Gesamtspeicherkapazität in Bytes zurückgeliefert wird.
pqwFree: Adresse eines 8 byte großen Speicherbereichs, in dem der gesamte freie Speicherplatz in Bytes zurückgeliefert wird.
Rückgabewert:
Bei Erfolg: Wenn die Funktion erfolgreich ausgeführt wurde, liefert die Funktion einen Wert <> 0 zurück.
Bei Fehlschlag: Wenn die Funktion fehlschlägt, liefert die Funktion den Wert 0 zurück.
Weitere benötigte Konstanten und Funktionen:
1 2 3 | Private Const MAX_PATH As Long = 260 Private Declare Function PathIsUNC Lib "shlwapi.dll" Alias "PathIsUNCA" (ByVal pszPath As String) As Long |
Der Artikel "Prüfen ob Pfadangabe ein UNC Pfad ist" behandelt diese API Funktion detailierter.
Die folgenden Funktionen kapseln die API Aufrufe um den freien Speicherplatz, gesamten Speicherplatz, den aufrufenden Benutzer zur Verfügung stehenden Speicherplatz und den belegten Speicherplatz zu ermitteln. Als Übergabeparameter erwarten diese Funktionen das Laufwerk oder einen UNC Pfad, für welche diese Informationen ermittelt werden sollen. Der Rückgabewert ist der ermittelte Speicherplatz in Bytes.
Funktion zum ermitteln des freien Speicherplatzes
1 2 3 4 56 7 8 9 1011 12 13 14 15 | Private Function GetFreeDiskSpace(ByVal Drive As String) As Currency Dim RetVal As Long If (Not CBool(PathIsUNC(Left$(Drive, MAX_PATH)))) Then RetVal = SHGetDiskFreeSpace(Left$(Drive, 1) & ":\", &H0, &H0, GetFreeDiskSpace)Else RetVal = SHGetDiskFreeSpace(Left$(Drive, MAX_PATH), &H0, &H0, GetFreeDiskSpace) End If If (CBool(RetVal)) Then GetFreeDiskSpace = GetFreeDiskSpace * 10000 Else GetFreeDiskSpace = -1 End If End Function |
Funktion zum ermitteln des gesamten Speicherplatzes
1 2 3 4 56 7 8 9 1011 12 13 14 15 | Private Function GetTotalDiskSpace(ByVal Drive As String) As Currency Dim RetVal As Long If (Not CBool(PathIsUNC(Left$(Drive, MAX_PATH)))) Then RetVal = SHGetDiskFreeSpace(Left$(Drive, 1) & ":\", &H0, GetTotalDiskSpace, &H0)Else RetVal = SHGetDiskFreeSpace(Left$(Drive, MAX_PATH), &H0, GetTotalDiskSpace, &H0) End If If (CBool(RetVal)) Then GetTotalDiskSpace = GetTotalDiskSpace * 10000 Else GetTotalDiskSpace = -1 End If End Function |
Funktion zum ermitteln des Speicherplatzes welcher dem aufrufenden Benutzer zur Verfügung steht
1 2 3 4 56 7 8 9 1011 12 13 14 15 | Private Function GetFreeCallerDiskSpace(ByVal Drive As String) As Currency Dim RetVal As Long If (Not CBool(PathIsUNC(Left$(Drive, MAX_PATH)))) Then RetVal = SHGetDiskFreeSpace(Left$(Drive, 1) & ":\", GetFreeCallerDiskSpace, &H0, &H0)Else RetVal = SHGetDiskFreeSpace(Left$(Drive, MAX_PATH), GetFreeCallerDiskSpace, &H0, &H0) End If If (CBool(RetVal)) Then GetFreeCallerDiskSpace = GetFreeCallerDiskSpace * 10000 Else GetFreeCallerDiskSpace = -1 End If End Function |
Funktion zum ermitteln des belegten Speicherplatzes. Diese ruft die Funktionen zum ermitteln des gesamten Speicherplatzes und freien Speicherplatzes auf.
1 2 3 4 56 7 8 9 10 | Private Function GetUsedDiskSpace(ByVal Drive As String) As Currency Dim TotalSpace As Currency Dim FreeSpace As Currency TotalSpace = GetTotalDiskSpace(Drive)FreeSpace = GetFreeDiskSpace(Drive) If ((TotalSpace > -1) And (FreeSpace > -1)) Then GetUsedDiskSpace = TotalSpace - FreeSpace End If End Function |
Hinweis:
Der Übergabeparameter kann ein kompletter Dateipfad sein. Die Funktionen extrahieren automatisch den Laufwerksbuchstaben bzw. überprüfen, ob der angegebene Pfad ein UNC Pfad ist






