C# 获取磁盘空间大小的两种方法

凌晨两点半
凌晨两点半
发布时间:2026-10-14 | 4人浏览过
原创

在 C# 开发中,经常需要检测本地磁盘的使用情况。本文将介绍两种常用的技术路径:一种是基于 System.IO 命名空间的轻量级方案,另一种是基于 WMI 的系统级查询方案,并分析各自的适用场景。

实现目标与准备

我们需要获取指定驱动器(如 C:)的以下数据:

  • 总容量 (TotalSize)
  • 剩余可用空间 (FreeSpace)
  • 已用空间 (UsedSpace)(可通过计算得出)

在开始之前,请确保项目引用了相应的命名空间:

  • 对于方法一,默认引用 System.IO。
  • 对于方法二,需要在项目中添加对 System.Management.dll 的引用,并在代码中使用 using System.Management;。

方法一:使用 System.IO.DriveInfo

这是最推荐的标准做法,无需依赖外部权限或复杂的配置,执行效率高且代码可读性强。

第1步:配置驱动器参数

目的:确定要查询的目标盘符。
输入:字符串类型的盘符,例如 "C"。
动作:将盘符转换为标准路径格式 "C:\\",以便与 DriveInfo.Name 进行匹配。

第2步:遍历系统驱动器

入口:调用静态方法 System.IO.DriveInfo.GetDrives()。
重要参数:DriveInfo 数组。
动作:通过 LINQ 或循环查找名称匹配的目标驱动器。
完成状态:成功获取对应的 DriveInfo 对象实例。

第3步:提取并转换数据

参数:TotalSize 和 TotalFreeSpace 属性返回的是字节(Bytes)为单位的长整型。
动作:将字节数除以 1024 * 1024 * 1024 转换为 GB 单位(根据需求可调整)。注意处理未找到驱动器的情况,避免返回错误数据。

参考代码示例:
/// <summary>
/// 获取指定驱动器的剩余空间(单位:GB)
/// </summary>
public static double GetHardDiskFreeSpaceGB(string driveLetter)
{
    // 确保盘符格式正确,例如 "C:" 变为 "C:\\"
    string path = driveLetter + ":\\";
    
    try 
    {
        DriveInfo drive = new DriveInfo(path);
        if (drive.IsReady) 
        {
            // TotalFreeSpace 单位为 Bytes,除以 1GB 得到 GB
            return (double)drive.TotalFreeSpace / (1024 * 1024 * 1024);
        }
    }
    catch (Exception ex)
    {
        // 处理可能发生的异常,如驱动器未就绪
        Console.WriteLine($"Error: {ex.Message}");
    }
    
    return -1.0; // 返回负值表示获取失败
}

优势**:API 稳定,兼容性好,无额外依赖。
局限**:仅能获取基本的容量信息,无法获取文件系统类型、序列号等高级属性。

方法二:使用 WMI (ManagementClass)

如果需要获取更多底层信息(如磁盘分区 ID、文件系统类型等),或者需要在网络环境中管理多台机器,可以使用 Windows Management Instrumentation (WMI)。

第1步:初始化 WMI 查询

入口:创建 ManagementClass("Win32_LogicalDisk") 实例。
动作:调用 GetInstances() 获取所有逻辑磁盘集合。
风险提醒**:WMI 查询速度相对较慢,且在某些高安全级别环境下可能需要特定的管理员权限才能访问部分磁盘信息。

第2步:解析磁盘属性

关键属性**:

  • Name:盘符名称。
  • Size:总大小(Bytes)。
  • FreeSpace:剩余空间(Bytes)。

动作:遍历集合,将每个磁盘的属性提取到字典或对象中。注意处理 null 值,因为某些非本地磁盘(如虚拟光驱)可能没有 Size 属性。

参考代码示例:
List<Dictionary<string, object>> diskInfos = new List<Dictionary<string, object>>();
var wmiClass = new ManagementClass("Win32_LogicalDisk");
var disks = wmiClass.GetInstances();

foreach (ManagementObject disk in disks)
{
    try 
    {
        var info = new Dictionary<string, object>
        {
            {"Name", disk["Name"]?.ToString()},
            {"FileSystem", disk["FileSystem"]?.ToString()},
            {"TotalSpace", Convert.ToInt64(disk["Size"] ?? 0)},
            {"FreeSpace", Convert.ToInt64(disk["FreeSpace"] ?? 0)}
        };
        diskInfos.Add(info);
    }
    catch (ManagementException ex)
    {
        Console.WriteLine($"WMI Query Error: {ex.Message}");
    }
}

方案对比与选择建议

特性 DriveInfo (System.IO) WMI (ManagementClass)
依赖 无额外引用 需引用 System.Management
性能 快 相对较慢
信息丰富度 基础容量信息 包含文件系统、卷标、序列号等
易用性 简单直接 需处理对象转换和空值

对于大多数桌面应用程序或 Web 应用中的本地磁盘检测需求,推荐使用第一种方法(DriveInfo)。它更加轻量且不易出错。

以上就是 C# 实现获取磁盘空间大小的详细内容,更多关于 C# 磁盘监控与管理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表