62

How can I get the list of logial drives (C#) on a system as well as their capacity and free space?

7 Answers 7

75

System.IO.DriveInfo.GetDrives()

Sign up to request clarification or add additional context in comments.

2 Comments

Is this something new that was added in the latest version of .NET. I wrote a small app to display this years ago but had to go the WMI route at the time. Very handy to know anyway... cheers
Quick look on MSDN: was added in .NET 2.0.
38
foreach (var drive in DriveInfo.GetDrives()) { double freeSpace = drive.TotalFreeSpace; double totalSpace = drive.TotalSize; double percentFree = (freeSpace / totalSpace) * 100; float num = (float)percentFree; Console.WriteLine("Drive:{0} With {1} % free", drive.Name, num); Console.WriteLine("Space Remaining:{0}", drive.AvailableFreeSpace); Console.WriteLine("Percent Free Space:{0}", percentFree); Console.WriteLine("Space used:{0}", drive.TotalSize); Console.WriteLine("Type: {0}", drive.DriveType); } 

Comments

25

Directory.GetLogicalDrives

Their example has more robust, but here's the crux of it

string[] drives = System.IO.Directory.GetLogicalDrives(); foreach (string str in drives) { System.Console.WriteLine(str); } 

You could also P/Invoke and call the win32 function (or use it if you're in unmanaged code).

That only gets a list of the drives however, for information about each one, you would want to use GetDrives as Chris Ballance demonstrates.

Comments

7

maybe this is what you want:

listBox1.Items.Clear(); foreach (DriveInfo f in DriveInfo.GetDrives()) listBox1.Items.Add(f); 

1 Comment

You might also want to check the IsReady property
3

You can retrieve this information with Windows Management Instrumentation (WMI)

 using System.Management; ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); // Loop through each object (disk) retrieved by WMI foreach (ManagementObject moDisk in mosDisks.Get()) { // Add the HDD to the list (use the Model field as the item's caption) Console.WriteLine(moDisk["Model"].ToString()); } 

Theres more info here about the attribute you can poll

http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html

2 Comments

Can't get this working on my computer. System.Management doesn't have ManagementObjectSearcher class now. The URL is also not pointing to a valid web page.
You need to add reference for that. On Visual Studio, Right click on project then go to Add -> Reference. Then, search for "System.Management" and add it.
2

This is a wonderful piece of code.

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3"); // Create query to select all the hdd's ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); // run the query ManagementObjectCollection queryCollection = searcher.Get(); // get the results string sVolumeLabel = ""; string[,] saReturn = new string[queryCollection.Count, 7]; int i = 0; // counter for foreach foreach (ManagementObject m in queryCollection) { if (string.IsNullOrEmpty(Convert.ToString(m["VolumeName"]))) { sVolumeLabel = "Local Disk"; } else { sVolumeLabel = Convert.ToString(m["VolumeName"]); } // Disk Label string sSystemName = Convert.ToString(m["SystemName"]); // Name of computer string sDriveLetter = Convert.ToString(m["Name"]); // Drive Letter decimal dSize = Math.Round((Convert.ToDecimal(m["Size"]) / 1073741824), 2); //HDD Size in Gb decimal dFree = Math.Round((Convert.ToDecimal(m["FreeSpace"]) / 1073741824), 2); // Free Space in Gb decimal dUsed = dSize - dFree; // Used HDD Space in Gb int iPercent = Convert.ToInt32((dFree / dSize) * 100); // Percentage of free space saReturn[i,0] = sSystemName; saReturn[i,1] = sDriveLetter; saReturn[i,2] = sVolumeLabel; saReturn[i,3] = Convert.ToString(dSize); saReturn[i,4] = Convert.ToString(dUsed); saReturn[i,5] = Convert.ToString(dFree); saReturn[i,6] = Convert.ToString(iPercent); i++; // increase counter. This will add the above details for the next drive. } 

Comments

2

I deployed an SSIS package and was getting an error simply because on Ballance example we are reading the drives without waiting for them to be ready:

string EmailMessage = ""; foreach (var drive in System.IO.DriveInfo.GetDrives()) { if (drive.IsReady == true) /*Make sure we can read*/ { double freeSpace = drive.TotalFreeSpace; double totalSpace = drive.TotalSize; double percentFree = (freeSpace / totalSpace) * 100; float num = (float)percentFree; //MessageBox.Show("Drive:" + drive.Name + " With " + num + "% free."); if (num < 5) { EmailMessage = "Drive:" + drive.Name + " With " + num + "% free."; } } } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.