Größe und Speicherplatz eines Laufwerks auslesen

Veröffentlicht: 13. Mai 2003 | Aktualisiert: 22. Jun 2004

Von Frank Eller

Das .NET Framework bietet derzeit noch keine (direkte) Methode, den freien Speicherplatz oder die Größe eines Laufwerks zu ermitteln. Über WMI ist dies zwar möglich, erfordert allerdings, dass WMI auf dem Zielrechner auch installiert ist. Zum Glück gibt es aber noch das Windows-API.

Die benötigte Funktion GetDiskFreeSpaceEx() ist in kernel32.dll enthalten und wie folgt deklariert:

[DllImport ("Kernel32", SetLastError=true)] 
public static extern bool GetDiskFreeSpaceEx( 
  [MarshalAs(UnmanagedType.LPStr)] string lpDirectoryName, 
  ref ulong lpFreeBytesAvailable, 
  ref ulong lpTotalNumberOfBytes, 
  ref ulong lpTotalNumberOfFreeBytes 
);

Der benannte Parameter SetLastError des DllImport-Attributes ermöglicht uns, im Fehlerfall die Windows-interne Fehlernummer zu ermitteln. Dazu genügt ein Aufruf der statischen Methode Marshal.GetLastWin32Error(). Im folgenden Beispiel wird nur die Fehlernummer ausgegeben, wenn Sie möchten können Sie aber auch eine Klartextmeldung erzeugen. Dazu verwenden Sie die API-Funktion FormatMessage().

Die Parameter, die GetDiskFreeSpace() erwartet, sind fast selbsterklärend. lpDirectoryName enthält die Kennung des Laufwerks, dessen Werte ermittelt werden sollen. Über das MarshalAs-Attribut ermöglichen wir hier die Verwendung eines .NET-Stringtyps anstelle eines nullbasierten Strings, wie ihn die C-Funktion eigentlich erwartet. Die Laufwerkskennung besteht selbstverständlich aus dem Laufwerksbuchstaben plus dem Doppelpunkt.

Die drei übrigen Parameter werden als Referenz übergeben und liefern die Werte zurück. Der Parameter lpFreeBytesAvailable liefert dabei die Anzahl der freien Bytes zurück, die dem aktuell angemeldeten Benutzer auf diesem Laufwerk noch zur Verfügung stehen. Normalerweise entspricht dieser Wert auch dem insgesamt noch freien Speicherplatz, der durch lpTotalNumberOfFreeBytes zurückgeliefert wird. lpTotalNumberOfBytes liefert den Gesamtspeicherplatz des Laufwerks.

Die folgende Klasse bietet eine Implementierung der Funktion, bei der der zurückgelieferte Speicherplatz nebenbei noch in Kilobytes umgerechnet wird.

using System; 
using System.IO; 
using System.Text; 
using System.Runtime.InteropServices; 
public class DiskSpace { 
  [DllImport ("Kernel32", SetLastError=true)] 
  public static extern bool GetDiskFreeSpaceEx( 
 [MarshalAs(UnmanagedType.LPStr)] string lpDirectoryName, 
 ref ulong lpFreeBytesAvailable, 
 ref ulong lpTotalNumberOfBytes, 
 ref ulong lpTotalNumberOfFreeBytes); 
  public static int GetDiskSpace(string drive, ref ulong user, ref ulong total, 
   ref ulong free) { 
 // Speicherplatz ermitteln 
 bool ok = GetDiskFreeSpaceEx(drive, ref user, ref total, ref free); 
 int result = 0; 
 if ( ok ) { 
   user /= 1024; 
   total /= 1024; 
   free /= 1024; 
 }  
 else { 
   result = Marshal.GetLastWin32Error(); 
 } 
 return result; 
  } 
}