各ドライブの容量と空き領域を取得するサンプルです。
「C#でドライブ毎のディスク容量と空き容量取得」と「C#の匿名型について調べてみた」、「匿名型の入れ子や匿名型配列が作れる」を参考にさせていただきました。
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
foreach (var drive in System.IO.DriveInfo.GetDrives())
{
if (!drive.IsReady) continue;
Console.WriteLine("{0} ({1}) 空き領域 {2}/{3}",
drive.VolumeLabel,
drive.RootDirectory.Name,
PrettyFormat(drive.TotalFreeSpace),
PrettyFormat(drive.TotalSize));
}
}
private static string PrettyFormat(double value)
{
var data = new[]
{
new { max = 1024d, baseValue = 1d, f = 1, format = "{0:0} byte" },
new { max = Math.Pow(1024, 1) * 10, baseValue = Math.Pow(1024, 1), f = 100, format = "{0:0.00} KB" },
new { max = Math.Pow(1024, 1) * 100, baseValue = Math.Pow(1024, 1), f = 10, format = "{0:0.0} KB" },
new { max = Math.Pow(1024, 1) * 1000, baseValue = Math.Pow(1024, 1), f = 1, format = "{0:0} KB" },
new { max = Math.Pow(1024, 2) * 10, baseValue = Math.Pow(1024, 2), f = 100, format = "{0:0.00} MB" },
new { max = Math.Pow(1024, 2) * 100, baseValue = Math.Pow(1024, 2), f = 10, format = "{0:0.0} MB" },
new { max = Math.Pow(1024, 2) * 1000, baseValue = Math.Pow(1024, 2), f = 1, format = "{0:0} MB" },
new { max = Math.Pow(1024, 3) * 10, baseValue = Math.Pow(1024, 3), f = 100, format = "{0:0.00} GB" },
new { max = Math.Pow(1024, 3) * 100, baseValue = Math.Pow(1024, 3), f = 10, format = "{0:0.0} GB" },
new { max = Math.Pow(1024, 3) * 1000, baseValue = Math.Pow(1024, 3), f = 1, format = "{0:0} GB" },
new { max = Math.Pow(1024, 4) * 10, baseValue = Math.Pow(1024, 4), f = 100, format = "{0:0.00} TB" },
new { max = Math.Pow(1024, 4) * 100, baseValue = Math.Pow(1024, 4), f = 10, format = "{0:0.0} TB" },
new { max = Math.Pow(1024, 4) * 1000, baseValue = Math.Pow(1024, 4), f = 1, format = "{0:0} TB" },
new { max = Math.Pow(1024, 5) * 10, baseValue = Math.Pow(1024, 5), f = 100, format = "{0:0.00} PB" },
new { max = Math.Pow(1024, 5) * 100, baseValue = Math.Pow(1024, 5), f = 10, format = "{0:0.0} PB" },
new { max = Math.Pow(1024, 5) * 1000, baseValue = Math.Pow(1024, 5), f = 1, format = "{0:0} PB" },
};
var datum = data.FirstOrDefault(_ => value < _.max);
if (datum == null) return string.Format("{0:0.00} EB", value / Math.Pow(1024, 6));
var v = Math.Floor(value / datum.baseValue * datum.f) / datum.f;
return string.Format(datum.format, v);
}
}
}