Getting a list of logical drives

Viewed 61660

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

7 Answers
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);
}

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.

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

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.
}

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.";
        }
    }
    
}
Related