[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern bool GetDiskFreeSpace(string lpRootPathName,
out uint lpSectorsPerCluster,
out uint lpBytesPerSector,
out uint lpNumberOfFreeClusters,
out uint lpTotalNumberOfClusters);
Declare Auto Function GetDiskFreeSpace Lib "kernel32.dll" (ByVal lpRootPathName As String, _
ByRef lpSectorsPerCluster As UInt32, _
ByRef lpBytesPerSector As UInt32, _
ByRef lpNumberOfFreeClusters As UInt32, _
ByRef lpTotalNumberOfClusters As UInt32) As Integer
On Windows 95/98 the GetDiskFreeSpace function cannot report volume sizes that are greater than 2 gigabytes (GB). To ensure that your application works with large capacity hard drives, use the GetDiskFreeSpaceEx function. On Windows NT and Windows 2000, GetDiskFreeSpace is not limited to 2GB; it reports the full size of the drive and the full amount of free space. See http://support.microsoft.com/kb/231497 .
If you are reading information for multiple drives and/or do not need sector cluster information, use the Managed API instead (System.IO.DriveInfo)
uint SectorsPerCluster;
uint BytesPerSector;
uint NumberOfFreeClusters;
uint TotalNumberOfClusters;
GetDiskFreeSpace("C:\\", out SectorsPerCluster, out BytesPerSector,
out NumberOfFreeClusters, out TotalNumberOfClusters);
Console.WriteLine("Sectors Per Cluster: {0}", SectorsPerCluster);
Console.WriteLine("Bytes Per Sector: {0}", BytesPerSector);
Console.WriteLine("Number Of Free Clusters: {0}", NumberOfFreeClusters);
Console.WriteLine("Total Number Of Clusters: {0}", TotalNumberOfClusters);
// SectorsPerCluster * BytesPerSection will give you how many bytes are available per sector
// And by multiplying the result with NumberOfFreeClusters gives you the free space in bytes.
long Bytes = (long)NumberOfFreeClusters * SectorsPerCluster * BytesPerSector;
Console.WriteLine("Total Free Space in bytes: {0} ", Bytes);
decimal KiloBytes = (decimal)Bytes / 1024;
Console.WriteLine("Total Free Space in kilo bytes: {0}", KiloBytes);
decimal MegaBytes = (decimal)KiloBytes / 1024;
Console.WriteLine("Total Free Space in mega bytes: {0}", MegaBytes);
decimal GigaBytes = (decimal)MegaBytes / 1024;
Console.WriteLine("Total Free Space in giga bytes: {0}", GigaBytes);
Console.WriteLine("Please enter any key to exit...");
Console.ReadLine();
Class | System.IO.DriveInfo |
Differences From WinAPI Function | You won't be able to get sector/cluster counts |
Drawbacks | You must enumerate all of your drives before information can be reviewed (using the DriveInfo.GetDrives() method (Why? new DriveInfo("C").AvailableFreeSpace works for me) |
The ManagedWindowsApi project (http://mwinapi.sourceforge.net) provides an ExtendedFileInfo class that can get sector/cluster sizes and counts.