50

I would like to access information on the logical drives on my computer using C#. How should I accomplish this? Thanks!

Ani
  • 111,048
  • 26
  • 262
  • 307
leo
  • 1,043
  • 2
  • 11
  • 8

6 Answers6

78

For most information, you can use the DriveInfo class.

using System;
using System.IO;

class Info {
    public static void Main() {
        DriveInfo[] drives = DriveInfo.GetDrives();
        foreach (DriveInfo drive in drives) {
            //There are more attributes you can use.
            //Check the MSDN link for a complete example.
            Console.WriteLine(drive.Name);
            if (drive.IsReady) Console.WriteLine(drive.TotalSize);
        }
    }
}
Vinko Vrsalovic
  • 330,807
  • 53
  • 334
  • 373
9

If you want to get information for single/specific drive at your local machine. You can do it as follow using DriveInfo class:

//C Drive Path, this is useful when you are about to find a Drive root from a Location Path.
string path = "C:\\Windows";

//Find its root directory i.e "C:\\"
string rootDir = Directory.GetDirectoryRoot(path);

//Get all information of Drive i.e C
DriveInfo driveInfo = new DriveInfo(rootDir); //you can pass Drive path here e.g   DriveInfo("C:\\")

long availableFreeSpace = driveInfo.AvailableFreeSpace;
string driveFormat = driveInfo.DriveFormat;
string name = driveInfo.Name;
long totalSize = driveInfo.TotalSize;
mmushtaq
  • 3,430
  • 7
  • 30
  • 47
6

What about mounted volumes, where you have no drive letter?

foreach( ManagementObject volume in 
             new ManagementObjectSearcher("Select * from Win32_Volume" ).Get())
{
  if( volume["FreeSpace"] != null )
  {
    Console.WriteLine("{0} = {1} out of {2}",
                  volume["Name"],
                  ulong.Parse(volume["FreeSpace"].ToString()).ToString("#,##0"),
                  ulong.Parse(volume["Capacity"].ToString()).ToString("#,##0"));
  }
}
TheVillageIdiot
  • 40,053
  • 20
  • 133
  • 188
Foozinator
  • 400
  • 3
  • 11
  • 1
    Just found it myself: ''foreach( ManagementObject volume in new ManagementObjectSearcher( "Select * from Win32_Volume" ).Get() ) { if( volume["FreeSpace"] != null ) { Console.WriteLine( "{0} = {1} out of {2}", volume["Name"], ulong.Parse( volume["FreeSpace"].ToString() ).ToString( "#,##0" ), ulong.Parse( volume["Capacity"].ToString() ).ToString( "#,##0" ) ); } } } – Foozinator Sep 06 '09 at 06:09
5

Use System.IO.DriveInfo class http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx

rravuri
  • 411
  • 3
  • 4
3

Check the DriveInfo Class and see if it contains all the info that you need.

bruno conde
  • 47,767
  • 15
  • 98
  • 117
1

In ASP .NET Core 3.1, if you want to get code that works both on windows and on linux, you can get your drives as follows:

var drives = DriveInfo
    .GetDrives()
    .Where(d => d.DriveType == DriveType.Fixed)
    .Where(d => d.IsReady)
    .ToArray();

If you don't apply both wheres, you are going to get many drives if you run the code in linux (e.g. "/dev", "/sys", "/etc/hosts", etc.).

This is specially useful when developing an app to work in a Linux Docker container.

JoanComasFdz
  • 2,911
  • 5
  • 34
  • 50