DriveInfo 是 Windows 下获取磁盘剩余空间最直接的 .NET 原生方案,需先检查 IsReady 再读 AvailableFreeSpace(用户实际可用字节数),注意单位换算差异(资源管理器用十进制 GB,IEC 标准用二进制 GiB),支持 EB 级大容量,但不枚举无盘符卷或 WSL2 挂载点。

用 DriveInfo 获取剩余空间最直接
Windows 下查磁盘剩余空间,DriveInfo 是 .NET 原生、稳定、无需 P/Invoke 的首选。它封装了 Win32 GetDiskFreeSpaceEx,自动处理符号链接、挂载点和权限边界。
关键点:必须先检查 IsReady,否则访问 AvailableFreeSpace 会抛 IOException(比如光驱无盘、U 盘被拔出、网络驱动器离线)。
var drive = new DriveInfo("C:\");
if (drive.IsReady)
{
long freeBytes = drive.AvailableFreeSpace; // 实际可用字节数(考虑配额、保留空间)
}
-
AvailableFreeSpace:用户真正能写的字节数(扣掉系统保留、磁盘配额) -
TotalFreeSpace:未分配 + 已分配但可回收的总字节数(不扣配额) -
TotalSize:总容量,含系统保留区(如 Windows 的 100MB 恢复分区不算在DriveInfo列表里)
DriveInfo.GetDrives() 返回的驱动器可能不全
调用 DriveInfo.GetDrives() 只返回当前系统识别的“有盘符或已挂载”的卷。它不会列出:
- 未分配盘符的 NTFS 卷(哪怕已格式化)
- BitLocker 加密但未解锁的驱动器(
IsReady == false,且通常不出现) - 某些通过 WSL2 挂载的 Linux 文件系统(如
\wsl$)——它们不是 Windows 卷,DriveInfo不感知
如果需要枚举所有本地物理卷(含无盘符),得用 ManagementObjectSearcher 查 Win32_Volume,但性能差、需管理员权限、依赖 WMI 服务。
单位换算容易错:别直接除 1024 再除 1024
显示“XX GB”时,常见错误是 freeBytes / 1024 / 1024 / 1024,这算的是 GiB(二进制),而 Windows 资源管理器默认显示的是 GB(十进制,即 ÷1000³)。两者差约 7%。
用户看到程序显示 “93.2 GB”,资源管理器显示 “100.0 GB”,就会觉得你算错了。
- 要匹配资源管理器:用
/ 1000.0 / 1000.0 / 1000.0 - 要符合 IEC 标准(如 KiB/MiB/GiB):用
/ 1024.0 / 1024.0 / 1024.0,并明确标注单位 - 别用整数除法(
/而非/=),否则小数位全丢
大容量磁盘(>2TB)下 AvailableFreeSpace 仍可靠
有人担心 long 类型溢出,其实不必:2TB ≈ 2 × 10¹² 字节,long 最大值约 9 × 10¹⁸,支持到 EB 级别。NTFS 单卷理论上限是 2⁶⁴−1 字节,DriveInfo 在 .NET 5+ 完全支持。
真正要注意的是:某些旧版 .NET Framework(如 4.0 之前)在 32 位进程里对超大值处理有边界问题,但现代项目基本不踩这个坑。
如果程序跑在容器或受限沙箱中(如某些 CI 环境),DriveInfo 可能因权限被截断 —— 这时候不是代码问题,是运行环境没给 SeBackupPrivilege 或文件系统访问权。










