Have you now, 2023-07-14 15:21 采纳率: 66.7%
浏览 31

C#如何获取到全部分区(包括Windows RE或者SYSTEM分区等等)的总空间和可用空间。

C#通过System.IO.DriveInfo.GetDrives或者ManagementClass ("Win32_LogicalDisk")方式获取到分区的总空间和可以用空间。但是存在一个问题,能获取的分区只有带盘符的分区。(例如:C: D:等等)。不带盘符的分区(如:Windows RE或者SYSTEM等),获取不到总空间和可用空间信息。请教各位牛牛们,想获取到不带盘符分区的总空间和可用空间信息,有啥好办法呀?

  • 写回答

1条回答 默认 最新

  • 单元测试是啥? 2023-07-14 15:29
    关注

    在 C# 中,如果要获取不带盘符的分区(如 Windows RE 或 SYSTEM)的总空间和可用空间信息,可以使用 WMI (Windows Management Instrumentation) 来实现。通过查询 Win32_LogicalDisk 类的实例,可以获取到所有分区的信息,包括不带盘符的分区。

    以下是一个示例代码,演示了如何使用 WMI 获取所有分区的总空间和可用空间信息:

    using System;
    using System.Collections.Generic;
    using System.Management;
    
    public class DiskInfo
    {
        public string Name { get; set; }
        public ulong TotalSize { get; set; }
        public ulong FreeSpace { get; set; }
    }
    
    public class Program
    {
        public static void Main()
        {
            List<DiskInfo> disks = GetDiskInfo();
            foreach (var disk in disks)
            {
                Console.WriteLine($"Name: {disk.Name}");
                Console.WriteLine($"Total Size: {disk.TotalSize} bytes");
                Console.WriteLine($"Free Space: {disk.FreeSpace} bytes");
                Console.WriteLine();
            }
        }
    
        public static List<DiskInfo> GetDiskInfo()
        {
            List<DiskInfo> disks = new List<DiskInfo>();
            
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"))
            {
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    string name = queryObj["Name"].ToString();
                    if (string.IsNullOrEmpty(name)) // 过滤掉没有盘符的分区
                        continue;
    
                    ulong totalSize = Convert.ToUInt64(queryObj["Size"]);
                    ulong freeSpace = Convert.ToUInt64(queryObj["FreeSpace"]);
    
                    DiskInfo disk = new DiskInfo
                    {
                        Name = name,
                        TotalSize = totalSize,
                        FreeSpace = freeSpace
                    };
    
                    disks.Add(disk);
                }
            }
    
            return disks;
        }
    }
    

    上述代码使用 ManagementObjectSearcher 执行查询语句 "SELECT * FROM Win32_LogicalDisk",并遍历结果集。通过判断分区的名称是否为空来过滤掉无盘符的分区。然后,读取总空间和可用空间的属性,并将这些信息保存到 DiskInfo 对象中。

    希望这个方法能够帮助到你!如有任何疑问,请随时追问。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月14日

悬赏问题

  • ¥15 Excel发现不可读取的内容
  • ¥15 UE5#if WITH_EDITOR导致打包的功能不可用
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。