How to get free Drive Space in C# and VB.NET

To get free Drive Space in C# and VB.NET you can use the following snippet.

Sample C#

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,out ulong lpFreeBytesAvailable,out ulong lpTotalNumberOfBytes,out ulong lpTotalNumberOfFreeBytes);

public static bool GetFreeDriveSpace(string path, out ulong freebytes)
{
	if (string.IsNullOrEmpty(path))
	{
		throw new ArgumentNullException("path");
	}

	if (!path.EndsWith("\\"))
	{
		path = String.Concat(path, "\\");
	}

	ulong lpFreeBytesAvailable;
	ulong lpTotalNumberOfBytes;
	ulong lpTotalNumberOfFreeBytes;

	if (GetDiskFreeSpaceEx(path, out lpFreeBytesAvailable, out lpTotalNumberOfBytes, out lpTotalNumberOfFreeBytes))
	{
		freebytes = lpFreeBytesAvailable;
		return true;
	}
	freebytes = 0;
	return false;
}

Sample VB.NET

<DllImport("kernel32.dll", SetLastError := True, CharSet := CharSet.Auto)> _
Private Shared Function GetDiskFreeSpaceEx(lpDirectoryName As String, ByRef lpFreeBytesAvailable As ULong, ByRef lpTotalNumberOfBytes As ULong, ByRef lpTotalNumberOfFreeBytes As ULong) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Shared Function GetFreeDriveSpace(path As String, ByRef freebytes As ULong) As Boolean
	If String.IsNullOrEmpty(path) Then
		Throw New ArgumentNullException("path")
	End If

	If Not path.EndsWith("\") Then
		path = [String].Concat(path, "\")
	End If

	Dim lpFreeBytesAvailable As ULong
	Dim lpTotalNumberOfBytes As ULong
	Dim lpTotalNumberOfFreeBytes As ULong

	If GetDiskFreeSpaceEx(path, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes) Then
		freebytes = lpFreeBytesAvailable
		Return True
	End If
	freebytes = 0
	Return False
End Function

Please rate this snippet

How to get the system drives in C# and VB.NET

To get the system drives in C# and VB.NET you can use the following snippet.

Sample C#

public static DriveInfo[] GetDrives(bool runningDrivesOnly)
{
	return runningDrivesOnly ? Enumerable.Cast<DriveInfo>(DriveInfo.GetDrives()).Where(x => x.IsReady).ToArray() : DriveInfo.GetDrives();
}

Sample VB.NET

Public Shared Function GetDrives(runningDrivesOnly As Boolean) As DriveInfo()
	Return If(runningDrivesOnly, Enumerable.Cast(Of DriveInfo)(DriveInfo.GetDrives()).Where(Function(x) x.IsReady).ToArray(), DriveInfo.GetDrives())
End Function

Please rate this snippet

How to get a drive serial number in C# and VB.NET

To get a drive serial number in C# and VB.NET you can use the following snippet.

Sample C#

public string GetDriveSerialNumber(string drive)
{
	try
	{
		var driveSerialnumber = string.Empty;
		var pathRoot = Path.GetPathRoot(drive);
		if (pathRoot == null)
		{
			return driveSerialnumber;
		}
		var driveFixed = pathRoot.Replace("\\", "");
		if (driveFixed.Length == 1)
		{
			driveFixed = driveFixed + ":";
		}
		var wmiQuery = string.Format("SELECT VolumeSerialNumber FROM Win32_LogicalDisk Where Name = '{0}'", driveFixed);
		using (var driveSearcher = new ManagementObjectSearcher(wmiQuery))
		{
			using (var driveCollection = driveSearcher.Get())
			{
				foreach (var moItem in driveCollection.Cast<ManagementObject>())
				{
					driveSerialnumber = ConvertHelper.ToString(moItem["VolumeSerialNumber"]);
				}
			}
		}
		return driveSerialnumber;
	}
	catch (Exception ex)
	{
		//handle the error your way
		return string.Empty;
	}
}

Sample VB.NET

Public Function GetDriveSerialNumber(drive As String) As String
	Try
		Dim driveSerialnumber = String.Empty
		Dim pathRoot = Path.GetPathRoot(drive)
		If pathRoot Is Nothing Then
			Return driveSerialnumber
		End If
		Dim driveFixed = pathRoot.Replace("\", "")
		If driveFixed.Length = 1 Then
			driveFixed = driveFixed + ":"
		End If
		Dim wmiQuery = String.Format("SELECT VolumeSerialNumber FROM Win32_LogicalDisk Where Name = '{0}'", driveFixed)
		Using driveSearcher = New ManagementObjectSearcher(wmiQuery)
			Using driveCollection = driveSearcher.Get()
				For Each moItem As var In driveCollection.Cast(Of ManagementObject)()
					driveSerialnumber = ConvertHelper.ToString(moItem("VolumeSerialNumber"))
				Next
			End Using
		End Using
		Return driveSerialnumber
	Catch ex As Exception
		'handle the error your way
		Return String.Empty
	End Try
End Function

Please rate this snippet