Home > Visual Basic Classic > Dateisystem > Speicherplatz Informationen eines Laufwerks ermitteln

Speicherplatz Informationen eines Laufwerks ermitteln

Veröffentlicht am 28.01.2009 von Sebastian Krogolewski

Artikelinformationen

Sprache:
Visual Basic 6
Datenbank:
keine

Artikel speichern

del.icioMister WongGoogleLinkarenaYiggSpurlFurl

Artikel bewerten

Bewertng:4.00 / 5 (2 mal bewertet)

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

VB Funktion
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

VB Funktion
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

VB Funktion
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.

VB Funktion
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

Downloads

Suchbegriffe

VB6, Visual Basic, SHGetDiskFreeSpace, SHGetDiskFreeSpaceA, SHGetDiskFreeSpaceW

Suche